Autofac Property Inject问题

时间:2016-06-22 10:02:22

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 autofac

我正在使用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。

1 个答案:

答案 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,但可能是另一个问题。