Autofac将属性设置为实例

时间:2011-02-02 16:35:21

标签: c# autofac

我对Autofac很新,我每次初始化时都试图在类上设置公共属性。这是场景。我有许多类继承自“实体”,遵循这种基本格式...

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();

我想要实现的是每次实例化时将“context”对象传递到Person类的ServiceContext属性。在此示例中,人员列表中的每个人都将设置此属性。

理想情况下,我会通过“实体”的构造函数传递DataContext,但问题是我无法访问Entity或Linq提供程序,因为它们来自第三方。所以我的问题是,使用Autofac,如何将“上下文”注入到“实体”派生的每个类的“ServiceContext”属性中?似乎OnActivating事件接近我的需要,但我无法让它发挥作用。

2 个答案:

答案 0 :(得分:9)

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。只需确保当您注册从“实体”派生的类型时(并且您需要注册所有这些类型或Autofac将不会在其组件注册表中将它们解析)您最后添加“PropertiesAutowired”。

类似于之前由@Chingiz发布的内容:

builder.RegisterAssemblyTypes(typeof(Person).Assembly)
       .Where(t => t.IsAssignableFrom(typeof(Entity)))
       .PropertiesAutowired();

如果您需要对其进行更多控制,可能需要查看property injectioncomponent activation events上的Autofac wiki以获取一些想法/参考。

答案 1 :(得分: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)));