我正在使用MV和EF和Autofac。我有一个叫做Helper的具体类。 Helper在另一个DLL中,而不是主要的MVC Web应用程序。
它有一个DBContext类型的属性叫做' Context'。
我想将DBContext的一个实例注入此属性 - 但它始终为null。
以下是我目前在GLobal中所拥有的内容:
var output = new DbContext(connectionString);
builder.RegisterInstance(output).As<DbContext>().PropertiesAutowired();
builder.RegisterType<Helper().WithParameter("Context",output).PropertiesAutowired();
// Set the dependency resolver to be Autofac.
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Context是Helper类的属性,我想用实例&#39;输出&#39;。
Context始终为null。
答案 0 :(得分:8)
在Autofac中,管理依赖关系的最简单方法是利用构造函数注入。
基本上,不要告诉Autofac“为我打开属性并做你的魔力”,而是告诉他让你负责宣布组件列表。
因此,不要想知道为什么属性注入不起作用,而是在Helper构造函数中明确声明您的依赖项:
public class Helper
{
public DbContext Context { get; private set; }
public Helper(DbContext context /* Autofac is going to fill in this */)
{
Context = context;
}
}
然后,在Global(或其他一些封装您的注册的类)中,您只需告诉Autofac查看Helper
类型并尽力调用最佳构造函数,这是您可以执行的最简单的操作:
// Either InstancePerDependency, or SingleInstance, or something else depending upon you requirements.
builder.RegisterType<Helper>().AsSelf().InstancePerDependency();
你应该完成:Autofac将搜索具有大多数参数的构造函数(并且只有一个参数类型为DbContext
,并将检查他是否知道如何为所请求的类型创建参数(他可以)。
所以,瞧,你准备好使用帮助了!
编辑:我保留上面的例子,因为这是问题的正确答案,但是,回复评论,我会以Init方法的形式使用更多的机制:
public class Helper
{
public DbContext Context { get; private set; }
public Init(DbContext context /* Autofac is going to fill in this */)
{
Context = context;
}
}
您可以指示Autofac在对象初始化期间调用此方法:
builder.RegisterType<CustomHelper>().AsSelf().InstancePerDependency()
.OnActivating(h => {
var dbContext = h.Context.Resolve<DbContext>();
((Helper)h.Instance).Init(context);
});
OnActivating允许您编写显式初始化调用。请记住,您可能希望在汇编中注册所有类型,这些类型派生自Helper
,但可能是另一个问题。