gpt4 book ai didi

inversion-of-control - 基于构造函数参数属性使用autofac解决依赖关系

转载 作者:行者123 更新时间:2023-12-04 23:10:18 28 4
gpt4 key购买 nike

我正在使用 Autofac。我想根据应用于构造函数参数的属性注入(inject)不同的依赖项实现。例如:

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>();

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

我怎样才能做到这一点?

最佳答案

听起来您想提供 IObjectContainer 的不同实现至CustomerRepositoryFooRepository .如果是这种情况,属性可能是 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) { ... }
}

关于inversion-of-control - 基于构造函数参数属性使用autofac解决依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2477613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com