我对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事件接近我的需要,但我无法让它发挥作用。
答案 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 injection和component 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)));