Попытка использовать интерфейс маркера не удалась с IEnumerable<>
Я пытаюсь имитировать некоторые вещи из Orchard CMS в моем собственном приложении, используя Unity...
Хорошо, так что я пытаюсь сделать это...
Допустим, у меня есть интерфейс маркера под названием IDependency.
public interface IDependency{ }
У меня тогда есть несколько интерфейсов, висящих от этого...
public interface ICustomerService : IDependency { }
public interface ICustomerRepository : IDependency { }
а потом еще несколько классов...
public class CustomerService : ICustomerService {
public CustomerService(ICustomerRepository customerRepo){ }
}
public class SomOtherCustomerService : ICustomerService {
public CustomerService(ICustomerRepository customerRepo){ }
}
public class NicksController : Controller {
public NicksController(IEnumerable<ICustomerService> customerServices) { }
}
public class NicksSecondController : Controller {
public NicksSecondController(IEnumerable<ICustomerService> customerServices) { }
}
Что у меня так далеко..
var container = new UnityContainer();
container
.ConfigureAutoRegistration()
.ExcludeSystemAssemblies()
//.Include(If.Implements<IDependency>, Then.Register()
//.As<IDependency>().UsingLifetime<PerResolveLifetimeManager>())
.Include(t =>
typeof(IDependency).IsAssignableFrom(t), (type, builder) =>
{
builder.RegisterType(type);
foreach (var interfaceType in type.GetInterfaces()
.Where(itf => typeof(IDependency).IsAssignableFrom(itf))) {
builder = builder.RegisterType(interfaceType, type);
}
})
.ApplyAutoRegistration();
Я падаю на введение IEnumerable в мой NicksSecondController... Есть идеи?
Ура, Ник
1 ответ
Решение
Из коробки Unity знает, как разрешать массивы. Взгляните на проект TecX на codeplex. Он содержит собственное расширение, которое учит контейнер обрабатывать IEnumerable<T>
, IList<T>
а также ICollection<T>
также. Код можно найти в TecX.Unity (папка Collections).