如何使用Autofac解析Action参数

时间:2016-02-19 18:14:06

标签: c# dependency-injection inversion-of-control autofac

如果是Action类型,如何执行resolve参数?

addToOrder: function () {  //this is the function that will need to update my parent element.
    this.pizza = {'ADD': true,
                  'CODE':this.pizza.CODE,
                  'GARNISHES':this.pizza.GARNISHES};

    this.fire('selectPage',4);
    console.log("SENT CHANGES");
    console.log(this.pizza);
},

NamedParameter和TypedParameter不起作用

1 个答案:

答案 0 :(得分:1)

首先,您不应该像使用Program.Container属性那样公开容器,并解决依赖关系。这是Service Locator的典型示例,它被认为是反模式。但是如果你真的需要或想要这样做,你的代码应该是这样的:

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<>可以创建实例并传递不可解析的参数。

此外,您应该使用适当的接口来解析/注入依赖项,而不是直接使用类型,因为您完全忽略了松散耦合组件的整体概念。