Unity поддерживает работу с generic-типами.
Можно в контейнер поместить обобщенный тип, а потом запросить тип с конкретными параметрами. Подробнее описано по ссылке http://msdn.microsoft.com/en-us/library/dd203156.aspx
Пример кода, использующего такую фичу.
Рассмотрим обобщенный класс репозитария для работы с данными
public interface IRepository<T> { IQueryable<T> Items(); void Save(T item); void Delete(T item); }
Реализация этого интерфейса для Entity Framework
public class EFRepository<T> : IRepository<T> where T : EntityObject { ObjectContext _context; string _entitySetName; public EFRepository(ObjectContext context) { _context = context; var container = _context .MetadataWorkspace .GetEntityContainer( _context.DefaultContainerName, DataSpace.CSpace); var edmEntityType = (EdmEntityTypeAttribute)typeof(T) .GetCustomAttributes( typeof(EdmEntityTypeAttribute), false) .Single(); _entitySetName = container.BaseEntitySets .Single(s => s.ElementType.Name == edmEntityType.Name && s.ElementType.NamespaceName == edmEntityType.NamespaceName) .Name; } public IQueryable<T> Items() { return _context.CreateQuery<T>(_entitySetName); } public void Save(T item) { switch (item.EntityState) { case System.Data.EntityState.Detached: _context.AddObject(_entitySetName, item); goto case System.Data.EntityState.Added; case System.Data.EntityState.Added: case System.Data.EntityState.Modified: _context.SaveChanges(); break; default: break; } } public void Delete(T item) { _context.DeleteObject(item); _context.SaveChanges(); } }
Есть EF модель с типом контекста AddressBookEntities и двумя сущностями Person и PhoneNumber и сервис SomeService1, работающий с этими сущностями.
Конструктор сервиса выглядит так:
public SomeService1(IRepository<Person> personsRepository, IRepository<PhoneNumber> phoneNumbersRepository) { }
Чтобы получить от Unity экземпляр сервиса можно написать такой код:
var container = new UnityContainer(); container .RegisterType<ObjectContext, AddressBookEntities>( new ContainerControlledLifetimeManager(), new InjectionConstructor()) .RegisterType(typeof(IRepository<>), typeof(EFRepository<>)); var service = container.Resolve<SomeService1>();
Unity сам создаст инстансы конкретных типов при сборке зависимостей SomeService1.