如何使用 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 您的依赖项使用适当的接口,而不是直接类型,因为您完全放弃了松散耦合组件的整个想法。
如果是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 您的依赖项使用适当的接口,而不是直接类型,因为您完全放弃了松散耦合组件的整个想法。