如何使用 Autofac 解析 Action 参数

How to resolve Action parameter with Autofac

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

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 不起作用

首先,您不应该像处理 Program.Container 属性 那样公开容器,并解决您的依赖关系。这是服务定位器的一个 classic 示例,它被认为是一种反模式。但是如果你真的需要或想要这样做,你的代码应该是这样的:

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;
    }
}

您可以将与连接相关的方法移动到某些 class,例如 Connector,并在构造函数中注入您的 TaskWrapper。使用 Func<> 允许您创建实例并传递不可解析的参数。

此外,您应该 resolve/inject 您的依赖项使用适当的接口,而不是直接类型,因为您完全放弃了松散耦合组件的整个想法。