我正在使用Autofac.我想基于我应用于构造函数参数的属性注入不同的依赖实现.例如:
class CustomerRepository { public CustomerRepository([CustomerDB] IObjectContainer db) { ... } } class FooRepository { public FooRepository([FooDB] IObjectContainer db) { ... } } builder.Register(c => /* return different instance based on attribute on the parameter */) .As<IObjectContainer>();
属性将提供数据,例如连接字符串,我可以使用它来实例化正确的对象.
我怎样才能做到这一点?
听起来您想要向CustomerRepository和FooRepository提供不同的IObjectContainer实现.如果是这种情况,属性可能是
thin metal ruler.相反,我将向您展示如何使用Autofac实现多个实现.
(为简洁起见,省略了.ContainerScoped()之类的调用.)
首先,通过命名注册为每个连接字符串注册一个版本的IObjectContainer:
builder .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB)) .As<IObjectContainer>() .Named("CustomerObjectContainer"); builder .Register(c => new ObjectContainer(ConnectionStrings.FooDB)) .As<IObjectContainer>() .Named("FooObjectContainer");
然后,解析存储库注册中的特定实例:
builder.Register(c => new CustomerRepository( c.Resolve<IObjectContainer>("CustomerObjectContainer")); builder.Register(c => new FooRepository( c.Resolve<IObjectContainer>("FooObjectContainer"));
这使得存储库没有配置信息:
class CustomerRepository { public CustomerRepository(IObjectContainer db) { ... } } class FooRepository { public FooRepository(IObjectContainer db) { ... } }