基于构造函数参数属性使用autofac解析依赖关系

时间:2010-03-19 13:28:16

标签: inversion-of-control autofac

我正在使用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>();

属性将提供数据,例如连接字符串,我可以使用它来实例化正确的对象。

我该怎么做?

2 个答案:

答案 0 :(得分:9)

听起来您希望提供IObjectContainerCustomerRepositoryFooRepository的不同实现。如果是这种情况,属性可能是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