Autofac 设置属性为实例

3

我对Autofac还比较陌生,现在我正在尝试每次初始化一个类时设置一个公共属性。下面是具体情况:我有许多继承自“Entity”的类,其基本格式如下...

public class Person : Entity
{
     public virtual DataContext ServiceContext { get; set; }
     public string FirstName {get; set;}
     ...
}

这些类通常会通过像这样的LINQ查询进行实例化:

var context = SomeContext(connection);    
var people = context.Query<Person>().Where(item => item.FirstName == "Joe").ToList();

我想要实现的目标是每次实例化Person类时将"context"对象传递到ServiceContext属性中。在这个例子中,people列表中的每个Person都会设置这个属性。
理想情况下,我会通过"Entity"的构造函数传递DataContext,但问题是我无法访问第三方提供的Entity或Linq提供程序。所以我的问题是,使用Autofac,如何将"context"注入到每个派生自"Entity"的类的"ServiceContext"属性中?看起来OnActivating事件接近我所需要的,但我无法使其工作。
2个回答

10

Autofac允许您在组件激活时注入属性。对于您的目的,有几种方法可以实现。

首先,您需要确定如何构建DataContext。您可以在lambda中注册其构造,也可以注册特定实例,或者使用参数注册类型。

var builder = new ContainerBuilder();

// You can register an instance...
var context = new DataContext(connectionString);
builder.RegisterInstance(context).As<DataContext>();

// OR you can register construction in a lambda...
builder.Register(c => new DataContext(connectionString)).As<DataContext>();

// OR you can register the type with constructor parameters.
builder.RegisterType<DataContext>()
       .WithParameter(
          new NamedParameter("fileOrServerOrConnection", connectionString));

一旦你做到了这一点,你就可以注册你的类型并设置属性自动装配:

builder.RegisterType<Person>().PropertiesAutowired();

在创建Person对象后,Autofac将会设置可以由它设置的任何属性。在这种情况下,DataContext将被解析和设置。只需确保在注册从“Entity”派生的类型(您确实需要注册所有这些类型,否则Autofac将无法将它们添加到其组件注册表中以进行解析)时,在末尾添加“PropertiesAutowired”。与@Chingiz之前发布的内容类似。
builder.RegisterAssemblyTypes(typeof(Person).Assembly)
       .Where(t => t.IsAssignableFrom(typeof(Entity)))
       .PropertiesAutowired();

如果你需要更多的控制权,你可能需要查看 Autofac 维基上有关属性注入和组件激活事件的一些想法/参考,请访问 属性注入组件激活事件

0

或许这会对你有所帮助

public class Person : Entity
{
    public Person(DataContext context)
    {
        ServiceContext = context;
    }
    public virtual DataContext ServiceContext { get; set; }
    public string FirstName { get; set; }
}

builder.Register<DataContext>(c => new DataContext(connectionString)).InstancePerHttpRequest();
builder.RegisterAssemblyTypes(typeof (Person).Assembly)
    .Where(t => t.IsAssignableFrom(typeof (Entity)));

似乎不起作用。行:builder.Register<DataContext>()会导致编译错误,我看不到您在哪里将DataContext设置为上下文对象?我尝试了一些其他方法,例如builder.RegisterInstance(context).As<DataContext>(),但都没有成功。 - SaaS Developer
因为 DataContext 需要连接字符串。已修复。 - Chingiz Musayev
我不认为这会起作用,因为第三方的 Linq 提供程序似乎使用了无参数构造函数。在激活期间是否有一种通过属性注入来实现这个的方法? - SaaS Developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接