DefaultsDescriptor
using Castle.Core;
using Castle.Core.Configuration;
using Castle.Core.Internal;
using System;
using System.Linq;
namespace Castle.MicroKernel.ModelBuilder.Descriptors
{
public class DefaultsDescriptor : IComponentModelDescriptor
{
private readonly Type implementation;
private readonly ComponentName name;
public DefaultsDescriptor(ComponentName name, Type implementation)
{
this.name = name;
this.implementation = implementation;
}
public void BuildComponentModel(IKernel kernel, ComponentModel model)
{
if ((object)model.Implementation == null)
model.Implementation = (implementation ?? FirstService(model));
EnsureComponentName(model);
EnsureComponentConfiguration(kernel, model);
}
public void ConfigureComponentModel(IKernel kernel, ComponentModel model)
{
}
private void EnsureComponentConfiguration(IKernel kernel, ComponentModel model)
{
IConfiguration configuration = kernel.ConfigurationStore.GetComponentConfiguration(model.Name);
if (configuration == null) {
configuration = new MutableConfiguration("component");
kernel.ConfigurationStore.AddComponentConfiguration(model.Name, configuration);
}
if (model.Configuration == null)
model.Configuration = configuration;
}
private void EnsureComponentName(ComponentModel model)
{
if (model.ComponentName == null) {
if (name != null)
model.ComponentName = name;
else if ((object)model.Implementation == typeof(LateBoundComponent)) {
model.ComponentName = new ComponentName("Late bound " + FirstService(model).FullName, false);
} else {
model.ComponentName = ComponentName.DefaultFor(model.Implementation);
}
}
}
private Type FirstService(ComponentModel model)
{
return model.Services.First();
}
}
}