Unity.AutoRegistration - регистрирует только интерфейсы и типы с одинаковым именем
Unity.AutoRegistration работает нормально, когда имя типа соответствует имени интерфейса, например, TClass
а также ITClass
, Я хочу, чтобы имена интерфейсов шли без префикса "T", например IClass
и нужно это IClass
соответствовать TClass
,
Но когда я переименую интерфейс, авторегистрация завершится неудачно. Должен ли я соответствовать типу / имени интерфейса или есть способ удовлетворить мою потребность?
2 ответа
После консультации с автором, вот необходимый код:
UContainer
.ConfigureAutoRegistration()
.LoadAssemblyFrom(Assembly.GetEntryAssembly().Location)
.ExcludeSystemAssemblies()
.Include(If.ImplementsITypeName, Then.Register())
.Include(
type => type.GetInterfaces().Any(i => i.Name.StartsWith("I") && i.Name.Substring(1) == type.Name.Substring(1)), Then.Register())
.Include(If.ImplementsSingleInterface, Then.Register())
.ApplyAutoRegistration();
Код для авторегистрации не тронут очень давно. Проект TecX на codeplex содержит усовершенствованный механизм конфигурации для Unity, который был запущен как порт конфигурации StructureMap. Этот движок также поддерживает соглашения для регистрации.
Одно из соглашений по умолчанию регистрирует класс MyService
как реализация интерфейса IMyService
, Это выглядит так просто:
public class ImplementsIInterfaceNameConvention : IRegistrationConvention
{
public void Process(Type type, ConfigurationBuilder builder)
{
if (!type.IsConcrete())
{
return;
}
Type pluginType = FindPluginType(type);
if (pluginType != null &&
Constructor.HasConstructors(type))
{
builder.For(pluginType).Add(type).Named(type.FullName);
}
}
private static Type FindPluginType(Type concreteType)
{
string interfaceName = "I" + concreteType.Name;
Type[] interfaces = concreteType.GetInterfaces();
return Array.Find(interfaces, t => t.Name == interfaceName);
}
}
Если вам нужно какое-то соглашение о присвоении имен, было бы очень легко изменить приведенный выше пример. Использование этого соглашения для настройки вашего контейнера будет выглядеть примерно так:
var builder = new ConfigurationBuilder();
builder.Scan(s =>
{
s.AssembliesFromApplicationBaseDirectory();
s.With(new MyCustomConvention());
});
var container = new UnityContainer();
container.AddExtension(builder);