2015-02-12 4 views
0

Я использую Autofac для IoC в своем проекте. Из-за некоторых устаревших программных библиотек я должен передать некоторые службы контроллеру, который не может быть разрешен, и должен быть передан как параметр.Autofac Разрешить использование фабрики делегатов по типу

Я сделал общий контроль с помощью делегата фабрики, как это:

public MyClass<TController, TInterface> { 

    private delegate TController ControllerFactory(TInterface service); 

    protected TController _myController; 
    protected TController Controller { 
     get 
     { 
      return _controller 
       ?? (_controller = ServiceLocator.Resolve<ControllerFactory>() 
            .Invoke(this); 
     } 
    } 

} 

Это отлично работает, но для этой работы мне нужно имя параметра обслуживания контроллера и имя параметра делегата службы быть таким же, потому что, как я читал, Autofac пары параметр BY NAME !!

Я видел, как вы можете сделать это по типу регистрирующего класса с общей Func <>, но из-за унаследованной приложение, которое я должен был бы оставить «чистый», то есть регистрации:

containerBuilder.RegisterType<MyController>(); 

Кто-нибудь знает если возможно, чтобы делегат соответствовал параметру по типу?

ответ

2

Кто-нибудь знает, если это возможно сделать делегат соответствует параметру по типу ??

Да, вы можете использовать предопределенные делегаты. См. Раздел динамической инстанцирования here.

Вот простой пример:

public class ComponentFactory 
    { 
     private readonly Func<Dependency, Component> _componentFactory; 

     public ComponentFactory(Func<Dependency, Component> componentFactory) 
     { 
      _componentFactory = componentFactory; 
     } 

     public Component Create(Dependency dependency) 
     { 
      return _componentFactory(dependency); 
     } 
    } 

    public class Component 
    { 
     private readonly Dependency _dependency; 

     public Component(Dependency dependency) 
     { 
      _dependency = dependency; 
     } 
    } 

    public class Dependency 
    { 
    } 

Регистрация + Использование

  var builder= new ContainerBuilder(); 
      builder.RegisterType<ComponentFactory>(); 
      builder.RegisterType<Component>(); 
      builder.RegisterType<Dependency>(); 

      var container = builder.Build(); 
      var factory = container.Resolve<ComponentFactory>(); 

      //Usage with typed parameters 
      var component = factory.Create(new Dependency()); 

** Будьте осторожны, если вы используете этот метод, Autofac бросает исключение, если вы пытаетесь добавить параметры с из такой же тип. Ex. Component имеет две зависимости от Dependency

Exception выглядит примерно так:

Параметр ввода списка типов имеет повторяющиеся типы. Попробуйте зарегистрировать пользовательский тип делегата вместо , используя общие отношения Func.

+0

Спасибо за ввод ... в любом случае, наконец, я не смог реализовать это решение из-за архитектурных проблем в проекте, которые я не могу изменить по причинам устаревшей совместимости ... но Я помню это для будущих реализаций! –

0

Autofac более конкретно о том, какой тип вы регистрируете контроллер, чем большинство контейнеров DI. Он будет разрешать тип только по типу, если вы включите .AsSelf() в регистрацию контроллера. Вот модуль, который мы используем в нашем проекте для регистрации контроллеров MVC.

public class MvcModule 
    : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     var currentAssembly = typeof(MvcModule).Assembly; 

     builder.RegisterAssemblyTypes(currentAssembly) 
      .Where(t => typeof(IController).IsAssignableFrom(t)) 
      .AsImplementedInterfaces() 
      .AsSelf() 
      .InstancePerDependency(); 
    } 
} 

Используя эту регистрацию, вы можете разрешить каждый контроллер по типу контроллера.

+0

Извините ... может быть, я не совсем себя зарекомендовал. Моя проблема решена с помощью делегированных фабрик, а не с самой регистрацией ... Я пытаюсь создать «базовый» класс, который будет разрешать общие контроллеры, но я не хочу использовать специальную регистрацию. Контроллер, конечно, будет зарегистрирован ... –

Смежные вопросы