Autofac-方法注入示例

本文关键字:注入 方法 Autofac- | 更新日期: 2023-09-27 18:01:12

有人能使用Autofac提供一个全面的方法注入示例吗?

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

所以,好吧,如何注册所有内容很简单,但我如何使用它?例如,我希望有一个方法可以注入HttpContext。所以,有这样的东西:

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

注意:构造函数注入是可能的,但我想了解方法注入的方式

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

更新

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

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

所以,如果我决定使用方法注入,那么该方法本质上表现得像一个setter(有点像Java setter方法(,那么是否可以在整个类实体中使用这种依赖关系?

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

Autofac-方法注入示例

在这里你可以找到一个小例子来开始:

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
{
}

如文档中所述,如果您使用的是Register而不是RegisterType,那么您还可以在创建服务实例的lambda表达式中调用该方法。

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

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

我创建了一个。NET Fiddle,这样你就可以看看这个例子了。

更新

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

是的,这是真的。

那么在整个类实体中使用这种依赖关系是可能的吗?

这也是真的,但如果将依赖项存储在(只读(字段或属性中,则构造函数注入也适用,而属性注入总是如此。

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

老实说,我从来没有在C#中使用过方法注入。我想,如果您想通过相应的setter方法设置字段,那么它在Java中更常见。在C#中,您可以对属性注入执行同样的操作。

如果设置依赖关系涉及相当复杂的代码,而我不想将这些代码放入属性的setter或构造函数中,那么我可能会使用方法注入。

然而,在大多数情况下,我建议您尽可能使用构造函数注入,如果不是出于任何原因(例如循环依赖关系(,则使用属性注入。