2015-02-12 52 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