2016-02-19 70 views
0

如何執行解析參數,如果是Action類型?如何使用Autofac解析Action參數

public class TaskWrapper : ITaskWrapper 
{ 
    public TaskWrapper(Action action) 
    { 
     this.action = action; 
    } 
} 

public void Connect() 
{ 
    Program.Container.Resolve<TaskWrapper>(new NamedParameter("action", ToConnect)); // not work! 
    Program.Container.Resolve<TaskWrapper>(new TypedParameter(typeof(Action), ToConnect)); // not work! 
} 

private void ToConnect() 
{ 
    // some code... 
} 

NamedParameter和TypedParameter不工作

回答

1

首先,你不應該暴露的容器,因爲你與你的Program.Container財產做,並解決您的依賴關係。這是服務定位器的典型例子,它被認爲是反模式。但如果你真的需要或想要做到這一點,你的代碼應該是這樣的:

public void Connect() 
{ 
    Action action = Connect; 
    Program.Container.Resolve<ITaskWrapper>(new NamedParameter("action", action)); 
} 

更好的方法是使用依賴注入如何真正應該使用 - 注入依賴。

public class Connector : IConnector 
{ 
    public Connector(Func<Action, ITaskWrapper> taskWrapperFactory) 
    { 
     var taskWrapper = taskWrapperFactory(Connect); 
    } 

    private void Connect() 
    {    
    } 
} 

public class TaskWrapper : ITaskWrapper 
{ 
    private readonly Action _task; 

    public TaskWrapper(Action task) 
    { 
     _task = task; 
    } 
} 

你可以將你的連接相關的方法的一些類,像Connector,並在構造函數中注入你TaskWrapper。使用Func<>可讓您創建實例並傳遞不可解析的參數。

另外,您應該使用適當的接口解決/注入您的依賴關係,而不是直接類型,因爲您完全鬆散了鬆散耦合組件的整個想法。