【发布时间】:2019-05-21 06:26:58
【问题描述】:
我有一个 Caller 类,它有一个默认构造函数和其他用于注入依赖项的参数化构造函数。
在Helper 类的一个地方,我有一个名为DoSomething 的方法,它需要Action<T>,其中T 的类型是Caller。
当需要使用参数化构造函数创建Caller 的实例以便在其中注入依赖项时,我如何将Caller 的实例作为参数传递给Action 委托 ?
注意:编写代码只是为了让问题易于理解。
public class Caller
{
private IServiceProvider _serviceProvider;
public string CallerName { get; set; }
public Caller()
{
// Do some initializations
}
public Caller(IServiceProvider serviceProvider) : this()
{
// Service Provider is injected to get some dependencies resolved later in the code.
_serviceProvider = serviceProvider;
}
}
public static class Helper
{
public static void DoSomething(Action<Caller> actOnCaller)
{
// Perform necessary stuff
}
}
public class Consumer
{
public Consumer()
{
// This works
Helper.DoSomething(c => { c.CallerName = "Test"; });
// How to pass an instance of Caller which I want with dependencies?
IServiceProvider serviceProvider = new MyServiceProvider();
var c2 = new Caller(serviceProvider);
// This does not work because of the scope of caller variable. I tried to "new-up" the Caller instance directly in lambda but that too didnt help.
Helper.DoSomething((c2 ) => { c2.CallerName = "Test Again"; });
}
}
【问题讨论】:
-
我不明白您为什么要将带有 Action 委托的方法带入其中,听起来您的整个问题都是关于这个 Caller 类和构造函数的?如果委托需要调用者的实例,那么在谈论委托时你如何构造调用者有什么关系呢?你能澄清一下你的问题到底是关于什么的吗?
-
这里的问题是该方法需要提供它自己的
Caller实例,而不是你在外面拥有的东西。你能提供一些关于“执行必要的东西”正在做什么的细节吗?它从哪里获得Caller实例?还是这个问题?如何获取外部Caller实例并使其在DoSomething方法中可用?简而言之,你把它传进去。这个设计对我来说似乎很奇怪。 -
你完全可以
Helper.DoSomething((ignore_me ) => { c2.CallerName = "Test Again"; });... 但这与显示的其余代码相比非常奇怪 - 如果你打算这样使用它,你为什么还要拥有Action<T>?