我对Autofac很新,我每次初始化时都试图在类上设置公共属性.这是场景.我有许多类继承自"实体",遵循这种基本格式......
public class Person : Entity
{
public virtual DataContext ServiceContext { get; set; }
public string FirstName {get; set;}
...
}
Run Code Online (Sandbox Code Playgroud)
这些类通常由LINQ查询实例化,如下所示:
var context = SomeContext(connection);
var people = context.Query<Person>().Where(item => item.FirstName == "Joe").ToList();
Run Code Online (Sandbox Code Playgroud)
我想要实现的是每次实例化时将"context"对象传递到Person类的ServiceContext属性.在此示例中,people列表中的每个Person都将设置此属性.
理想情况下,我会通过"实体"的构造函数传递DataContext,但问题是我无法访问Entity或Linq提供程序,因为它们来自第三方.所以我的问题是,使用Autofac,如何将"上下文"注入到"实体"派生的每个类的"ServiceContext"属性中?似乎OnActivating事件接近我的需要,但我无法让它工作.
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));
Run Code Online (Sandbox Code Playgroud)
完成后,您可以注册类型并设置要自动装配的属性:
builder.RegisterType<Person>().PropertiesAutowired();
Run Code Online (Sandbox Code Playgroud)
这将是在创建Person对象之后,可以由Autofac设置的任何属性.在这种情况下,将解析和设置DataContext.只需确保当您注册从"实体"派生的类型(并且您需要注册所有这些类型或Autofac将不会在其组件注册表中将它们解析)时,您最后添加"PropertiesAutowired".
类似于之前由@Chingiz发布的内容:
builder.RegisterAssemblyTypes(typeof(Person).Assembly)
.Where(t => t.IsAssignableFrom(typeof(Entity)))
.PropertiesAutowired();
Run Code Online (Sandbox Code Playgroud)
如果您需要对它进行更多控制,您可能需要查看属性注入和组件激活事件的Autofac wiki以获取一些想法/参考.
| 归档时间: |
|
| 查看次数: |
7233 次 |
| 最近记录: |