Autofac - 方法注入示例

gdy*_*tis 4 c# dependency-injection autofac

任何人都可以使用Autofac提供全方位的方法注入示例吗?

我检查了文档,但我发现很难理解这是如何工作的以及如何解决方法.

那么,好吧,如何注册所有内容非常简单,但我该如何使用呢?例如,我想要一个HttpContext注入的方法.所以,有这样的事情:

builder
  .Register<MyObjectType>()
  .OnActivating(e => {
    var dep = new HttpContextWrapper(HttpContext.Current);
    e.Instance.SetTheDependency(dep);
  })
  .InstancePerRequest();
Run Code Online (Sandbox Code Playgroud)

注意:这可以通过构造函数注入来实现,但我想了解方法注入方式.

问题是如何使用已解析的实例?是否可以使用方法注入通过接收依赖项的方法返回结果?行为不是在参数注入附近,而是以某种方式接近属性注入?

更新

@fknx基本上回答了我的问题:

方法注入只是意味着您的依赖项不作为构造函数参数传递或直接分配给属性,而是使用(setter)方法设置它

所以,如果我决定使用方法注入,该方法本质上就像一个setter(有点像Java setter方法),所以可以在整个类实体中使用这个依赖?

这样做的原因是什么以及它如何从房产注入中获益?

fkn*_*knx 6

在这里,您可以找到一个小例子来帮助您入门:

using System;
using Autofac;

public class Program
{
    public static void Main()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<MyService>()
            .OnActivating(e => e.Instance.SetMyDependency(new MyDependency()));

        var container = builder.Build();
        container.Resolve<MyService>();
    }
}

public class MyService
{
    private MyDependency _myDependency;

    public void SetMyDependency(MyDependency myDependency)
    {
        _myDependency = myDependency;
        Console.WriteLine("SetMyDependency called");
    }
}

public class MyDependency
{
}
Run Code Online (Sandbox Code Playgroud)

文档中所述,您还可以调用lambda表达式中的方法来创建服务实例,如果您使用的话,则Register代替RegisterType.

但我发现很难理解这是如何工作的以及该方法是如何解决的.

这听起来有点奇怪.方法注入只是意味着您的依赖项不作为构造函数参数传递或直接分配给属性,而是使用(setter)方法设置它.

我已经创建了一个.NET小提琴,以便您可以查看示例.

更新

所以,如果我决定使用方法注入,该方法本质上就像一个setter(有点像Java setter方法)

是的,这是真的.

所以可以在整个类实体中使用这种依赖吗?

这也是正确的,但是如果将依赖项存储在(只读)字段或属性中,这也适用于构造函数注入,并且属性注入总是如此.

这样做的原因是什么以及它如何从房产注入中获益?

说实话,我从未在C#中使用过方法注入.我想如果你想通过相应的setter方法设置一个字段,它在Java中更常见.在C#中,您可以对属性注入执行相同操作.

也许我会使用方法注入,如果设置依赖项将涉及相当复杂的代码,我不想放入属性的setter或构造函数.

但是,在大多数情况下,我建议您尽可能使用构造函数注入,并在不是出于任何原因(例如循环依赖性)时使用属性注入.