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.
