【问题标题】:How do I Configure Unity to use constructor injection如何配置 Unity 以使用构造函数注入
【发布时间】:2015-07-16 14:41:28
【问题描述】:

在我的 MVC 5 应用程序中,我使用的是 Unity。构造函数注入按预期工作正常。假设我有一个不是控制器的类,并且我有这个用于构造函数注入的设置,我如何配置 Unity(代码不是 xml)来告诉它在我新建类的实例时使用构造函数注入。这可能吗?

我的课在下面:

public class Thing
{
    private readonly IAuthorisationService _authorisationService;

    public Thing()
    {

    }

    public Thing(IAuthorisationService authorisationService)
    {
        _authorisationService = authorisationService;
    }

    public void Work()
    {
        var result = _authorisationService.IsAdmin(Guid.NewGuid());
    }
}

所以我错过了在我创建新事物时告诉 unity 接管和注入的部分。

有什么想法吗?

【问题讨论】:

    标签: c# model-view-controller dependency-injection


    【解决方案1】:

    假设默认 Unity 配置所有类都自动注册到 Unity,因此您唯一需要的是为容器上的类调用 Resolve

    var theThing = container.Resolve<Thing>();
    

    请注意,通常你通过在其他类(即控制器)中依赖 Thing 来神奇地实现它。

    如果您需要创建 Thing 的多个实例,请改为依赖 Func&lt;Thing&gt;(它也是自动注册的,并提供了以您使用 new 的方式创建由容器解析的实例的方法)。

     public MyController(Func<Thing> thingCreator)
     {
         var manyThings = Enumerable.Range(0, 9001).Select(()=> thingCreator());
         ...
     }
    

    【讨论】:

    • 好吧,我现在很困惑。我试过这个并且它有效,但是当我再次运行它时它现在不起作用。请参阅上面的更新代码。
    • @DaveAmour 如果您对 question 有更新,请在问题中编辑它们。您建议的编辑不属于答案...“does_not_work”也不是对问题的真正解释。旁注:我强烈建议您编写代码作为单元测试(或在命令行应用程序中)并首先在那里工作,因为通常更容易调试较小的代码。
    • 抱歉 Alexei - 我一定很愚蠢,因为我发现 SO UI 很难使用。我如何向您显示更多代码以响应评论?我不想更改问题,但要回复您的答案 - 这些评论框中没有足够的空间。这样做的正确方法是什么?
    • @DaveAmour 是的,你不能在 cmets 中放更多的半行代码并保持可读性。这主要是有意将 SO 作为 cmets 进行澄清。更新问题或提出新问题是常见的选项。在你的情况下用独立样本(最好是MCVE)提出单独的问题似乎很合理。
    • 如果我正在与 3 个人进行对话,并且我想更新我的问题以反映我们正在讨论的内容,那么这将不会很好,并且不断产生新问题而不是进行对话似乎是对我来说有点荒谬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多