Это полностью зависит от ваших потребностей, но обычно вам нужно использовать нестандартный метод регистрации Container
. Вы можете определить свои собственные запросы LINQ для запроса метаданных приложения, чтобы получить правильные типы, и зарегистрировать их, используя неуниверсальные методы регистрации. Вот пример:
var weaponsAssembly = typeof(Bow).Assembly;
var registrations =
from type in weaponsAssembly.GetExportedTypes()
where type.Namespace.Contains(".Weapons")
from service in type.GetInterfaces()
select new { Service = service, Implementation = type };
foreach (var reg in registrations)
{
container.Register(reg.Service, reg.Implementation);
}
Если вам нужно пакетно зарегистрировать набор реализаций на основе общего универсального интерфейса, вы можете использовать RegisterManyForOpenGeneric:
// include the SimpleInjector.Extensions namespace.
container.RegisterManyForOpenGeneric(typeof(IValidator<>),
typeof(IValidator<>).Assembly);
Это будет искать все (не общие) общедоступные типы в предоставленной сборке, которые реализуют IValidator<T>
, и регистрировать каждый из них по их закрытой универсальной реализации. Если тип реализует несколько закрытых универсальных версий IValidator<T>
, все версии будут зарегистрированы. Взгляните на следующий пример:
interface IValidator<T> { }
class MultiVal1 : IValidator<Customer>, IValidator<Order> { }
class MultiVal2 : IValidator<User>, IValidator<Employee> { }
container.RegisterManyForOpenGeneric(typeof(IValidator<>),
typeof(IValidator<>).Assembly);
Предполагая данный интерфейс и определения классов, показанная регистрация RegisterManyForOpenGeneric
эквивалентна следующей ручной регистрации:
container.Register<IValidator<Customer>, MultiVal1>();
container.Register<IValidator<Order>, MultiVal1>();
container.Register<IValidator<User>, MultiVal2>();
container.Register<IValidator<Employee>, MultiVal2>();
Также было бы легко добавить удобные методы расширения. Возьмем, к примеру, следующий метод расширения, который позволяет зарегистрировать одну реализацию всеми ее реализованными интерфейсами:
public static void RegisterAsImplementedInterfaces<TImpl>(
this Container container)
{
foreach (var service in typeof(TImpl).GetInterfaces())
{
container.Register(service, typeof(TImpl));
}
}
Его можно использовать следующим образом:
container.RegisterAsImplementedInterfaces<Sword>();
person
Steven
schedule
18.10.2012