我正在使用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>();
属性将提供数据,例如连接字符串,我可以使用它来实例化正确的对象。
我该怎么做?
答案 0 :(得分:9)
听起来您希望提供IObjectContainer
到CustomerRepository
和FooRepository
的不同实现。如果是这种情况,属性可能是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) { ... }
}
答案 1 :(得分:0)
当你有几个存储库并且它们的构造函数参数很少时,Bryan的答案已经足够好了。但是当你拥有很多root时,很难设置你的root。您可以通过在解析接口时扫描类元数据来实现此目的。当您获得有关其参数的信息时,您可以解决它的实际实现。请参阅我的回答here。