2015-02-12 69 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如果您尝试使用的添加参数抛出异常相同的类型。防爆。 Component有两个依赖于Dependency

异常看起来是这样的:

输入参数类型列表 有重复的类型。尝试使用通用Func关系注册自定义委托类型而不是 。

+0

感谢您的输入...无论如何,由于项目中的架构问题,我无法为了兼容性原因而更改,最终无法实现此解决方案...但我会牢记未来的实施! – 2015-02-20 09:45:19

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

对不起...也许我没有表达自己很正确。我的问题是与委托工厂解决,而不是与注册本身...我试图做一个“基地”类,将解决通用控制器,但我不想使用任何特殊的注册。当然,控制器将被注册... – 2015-02-17 09:55:20