2014-01-10 3 views
2

Я хочу зарегистрировать общий класс репозитория, используя Unity.Dynamically Register Generic Type

Это мой общий класс:

public class Repository<TModel> 
    : IRepository<TModel> where TModel : class, IModel 

TModel является объектом ПОКО используется с Entity.

Если я зарегистрирую его таким образом, он будет работать.

IOC_Container.RegisterType(typeof(IRepository<Employee>), typeof(Repository<Employee>)); 

Это потребует, хотя я зарегистрирую каждый из TModel, который становится громоздким.

У меня есть bootstrapper, который динамически регистрирует мои классы обслуживания с помощью отражения, и я хотел бы сделать то же самое с репозиториями.

Это код Загрузчик для услуг:

var currentAssembly = Assembly.LoadFrom(assembly); 
var assemblyTypes = currentAssembly.GetTypes(); 

foreach (var assemblyType in assemblyTypes) 
{ 
    if (assemblyType.IsInterface) 
    { 
     continue; 
    } 

    if (assemblyType.FullName.EndsWith("Service")) 
    { 
     foreach (var requiredInterface in assemblyType.GetInterfaces()) 
     { 
      if (requiredInterface.FullName.EndsWith("Service")) 
      { 
       var typeFrom = assemblyType.GetInterface(requiredInterface.Name); 
       var typeTo = assemblyType; 
       IOC_Container.RegisterType(typeFrom, typeTo); 
      } 
     } 
    } 
} 

}

Любые предложения?

ответ

4

Unity 3 поддерживает registration by convention. Использование регистрации по соглашению ваш пример может выглядеть следующим образом:

var currentAssembly = Assembly.LoadFrom(assembly); 

IOC_Container.RegisterTypes(
    currentAssembly.GetTypes().Where(
     t => t.FullName.EndsWith("Service"), 
    WithMappings.MatchingInterface, 
    WithName.Default); 

выше зарегистрирует интерфейс IRepository<Employee> к сопрягая Repository<Employee> конкретного типа.

Это может сделать жизнь немного проще при регистрации нескольких типов, но для определенного кода репозитория, который вы опубликовали, вам может не понадобиться эта функциональность. Unity позволяет зарегистрировать открытые универсальные типы, так вместо регистрации всех комбинаций IRepository вы можете просто выполнить одну регистрацию:

IOC_Container.RegisterType(
    typeof(IRepository<>), typeof(Repository<>)); 

При решении IRepository<Employee> Unity будет использовать тип сотрудника для решения Repository<Employee>.