我正在努力实现一些可能是不可能的事情。
我们有一个大型 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
创建 WorkerA
,WorkerB
创建 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/