gpt4 book ai didi

c# - 注入(inject)属性(递归)而不将其作为参数传递

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:48 25 4
gpt4 key购买 nike

我正在努力实现一些可能是不可能的事情。

我们有一个大型 MVC 5 应用程序。我创建了一个小型 MVC 项目来模拟和解释我想将什么应用到那个大型 MVC 项目中。

我有一个具有唯一 ID 的 Controller 。在此示例项目中,会为每个请求重新生成唯一 ID。在 MVC 项目中,它有点复杂和不同。但是,它与本示例的范围无关。

public class FooController : Controller
{
public string UniqueId = Guid.NewGuid().ToString("N");
public ActionResult Index()
{
var worker = new WorkerA();
worker.DoWork();
return View();
}
}

FooController 创建 WorkerAWorkerB 创建 WorkerC 等等。 worker 不一样。它们没有相同的接口(interface)/实现。为了使示例简单,我让它们看起来很相似。

这是 worker :

public class WorkerA
{
public string UniqueId = string.Empty;

public void DoWork()
{
var worker = new WorkerB();
worker.DoWork();
//...
//...

}
}
public class WorkerB
{
public string UniqueId = string.Empty;

public void DoWork()
{
var worker = new WorkerC();
worker.DoWork();
}
}

我想将属性 UniqueId 注入(inject)到 worker 中,而不必将其作为参数传递。

我想避免这样做:

public WorkerA(string uniqueId)
{
UniqueId = uniqueId;
}

但我需要为所有其他 worker 做同样的事情。

编辑

有没有办法通过 ninject 实现这一目标?

最佳答案

您可以通过以下方式使用 Microsoft.Practices.Unity 实现您想要的:

 public class WorkerA
{
[Dependency]
public string UniqueId { get; set; }

}

public class WorkerB
{
[Dependency]
public string UniqueId { get; set; }
}

然后:

 var container = new UnityContainer();
container.RegisterType<WorkerA>(new InjectionProperty(nameof(WorkerA.UniqueId),"WorkerAValue"));
container.RegisterType<WorkerA>(new InjectionProperty(nameof(WorkerB.UniqueId), "WorkerBValue"));

稍后,您可以从容器中请求配置了所需属性的实例:

var workerA = container.Resolve<WorkerA>();
var workerB = container.Resolve<WorkerB>();

关于c# - 注入(inject)属性(递归)而不将其作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43188264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com