如何使用自动法解析操作参数

本文关键字:操作 参数 何使用 | 更新日期: 2023-09-27 18:35:28

如何执行解析参数,如果是操作类型?

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

命名参数和类型参数不起作用

如何使用自动法解析操作参数

首先,您不应该像处理 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<> 可以创建实例并传递不可解析的参数。

此外,您应该使用适当的接口(而不是直接类型)解析/注入依赖项,因为您完全失去了松散耦合组件的整个想法。