任何人都可以使用Autofac提供全方位的方法注入示例吗?
我检查了documentation,但我发现很难理解这是如何工作的以及如何解决方法.
那么,好吧,如何注册所有内容非常简单,但我该如何使用呢?例如,我想要一个获取HttpContext注入的方法.所以,有这样的事情:
builder
.Register<MyObjectType>()
.OnActivating(e => {
var dep = new HttpContextWrapper(HttpContext.Current);
e.Instance.SetTheDependency(dep);
})
.InstancePerRequest();
注意:这可以通过构造函数注入来实现,但我想了解方法注入方式.
问题是如何使用已解析的实例?是否可以使用方法注入通过接收依赖项的方法返回结果?行为不是在参数注入附近,而是以某种方式接近属性注入?
更新
@fknx基本上回答了我的问题:
Method injection simply means that your dependency is not passed as a
constructor parameter or directly assigned to a property, but that it
is set using a (setter) method instead
所以,如果我决定使用方法注入,该方法本质上就像一个setter(有点像Java setter方法),所以可以在整个类实体中使用这个依赖?
这样做的原因是什么以及它如何从房产注入中获益?
解决方法:
在这里,您可以找到一个小例子来帮助您入门:
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
{
}
如documentation中所述,如果使用Register而不是RegisterType,也可以在lambda表达式中调用创建服务实例的方法.
but I find it hard to understand how this works and how the method is resolved.
这听起来有点奇怪.方法注入只是意味着您的依赖项不作为构造函数参数传递或直接分配给属性,而是使用(setter)方法设置它.
我创建了一个.NET Fiddle,以便您可以查看示例.
更新
So, if I decide to use method injection, the method essentially is behaving like a setter (kinda like the Java setter methods)
是的,这是真的.
so it is possible to use this dependency throughout the class entity?
这也是正确的,但是如果将依赖项存储在(只读)字段或属性中,这也适用于构造函数注入,并且属性注入总是如此.
What is the reason to do that and how it benefits from property injection?
说实话,我从未在C#中使用过方法注入.我想如果你想通过相应的setter方法设置一个字段,它在Java中更常见.在C#中,您可以对属性注入执行相同操作.
也许我会使用方法注入,如果设置依赖项将涉及相当复杂的代码,我不想放入属性的setter或构造函数.
但是,在大多数情况下,我会建议您尽可能使用构造函数注入,并在不是出于任何原因(例如circular dependencies)时使用属性注入.