2016-02-19 74 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<>可让您创建实例并传递不可解析的参数。

另外,您应该使用适当的接口解决/注入您的依赖关系,而不是直接类型,因为您完全松散了松散耦合组件的整个想法。