Autofac Property Inject问题

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.

A. *_*esa 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;
    }
}
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,但可能是另一个问题.