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

标签 c# asp.net-mvc design-patterns asp.net-mvc-5 ninject

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

我们有一个大型 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/

相关文章:

design-patterns - 数据验证设计模式

c# - Visual Studio for Mac - 支持 UWP

jquery - 如何使用 JQuery 更改模型的值?

c# - 持久 Entity Framework 查询缓存

asp.net-mvc - 如何在 mvc4 中使用单选按钮列表

c# - Unity 中是否有 "Singletons"(持久游戏对象)的最佳实践?

java - 构建器模式是否适用此要求?

C# 从集合类访问对象的属性

c# - 如何将从数据库中检索到的日期转换为仅显示 d/mm/yyyy?

c# - 东亚本地化软件中的访问/快捷键?