Chr*_*ris 1 c# asp.net-mvc entity-framework autofac asp.net-mvc-4
我正在使用MVC与EF和Autofac.我有一个叫做Helper的具体类.Helper在另一个DLL中,而不是主要的MVC Web应用程序.
它有一个名为"Context"的DBContext类型的属性.
我想将一个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));
Run Code Online (Sandbox Code Playgroud)
Context是Helper类的属性,我想用实例'output'注入.
上下文始终为null.
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在Global(或其他一些封装您的注册的类)中,您只需告诉Autofac查看Helper类型并尽力调用最佳构造函数,这是您可以执行的最简单的操作:
// Either InstancePerDependency, or SingleInstance, or something else depending upon you requirements.
builder.RegisterType<Helper>().AsSelf().InstancePerDependency();
Run Code Online (Sandbox Code Playgroud)
您应该完成: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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以指示Autofac在对象初始化期间调用此方法:
builder.RegisterType<CustomHelper>().AsSelf().InstancePerDependency()
.OnActivating(h => {
var dbContext = h.Context.Resolve<DbContext>();
((Helper)h.Instance).Init(context);
});
Run Code Online (Sandbox Code Playgroud)
OnActivating允许您编写显式初始化调用.请记住,您可能希望在程序集中注册所有类型Helper,但可能是另一个问题.