gpt4 book ai didi

c# - 连接字符串代理?

转载 作者:行者123 更新时间:2023-11-30 20:39:42 26 4
gpt4 key购买 nike

我的应用程序使用了一堆 Service 类,其中许多类都有一个支持 Repository 类。当我的应用程序启动时,我创建了一个新的 Unity 容器,其中包含创建我所有服务和存储库类的句柄,并执行所有依赖项注入(inject)。我看到的示例表明,通过全局容器拥有 Unity 容器是一种不好的做法,因此它在创建完所有需要创建的对象后就超出了范围。然后这些对象在程序的其余部分中传递。

我的问题是我有一个“设置”窗口,它允许用户更改数据库名称和服务器。但是,所有服务对象都已经具有通过注入(inject)原始数据库名称和服务器创建的支持存储库对象。因此,我必须更改所有已创建的 Repository 对象的数据库连接字符串。

我正在考虑创建类似 IDatabaseConnectionStringProxy 接口(interface)的东西,并让我的所有 Repository 对象都引用该类型的单个对象,而不是每个 Repository 显式存储其连接字符串。然后我可以让我的“设置”窗口更新所有存储库类都指向的单个代理对象上的连接字符串。这是好的设计还是糟糕的做事方式?如果这不是一个好主意,我应该如何处理?

最佳答案

这听起来像是 my book 中第 272 页描述的充满异国情调的 future 生活方式的变体。 .我认为您应该能够使用 Decorator 来解决这个问题,而不是发明一个新的界面。 .

首先,让我们想象一下所涉及的类型是什么样的。听起来您有一些存储库接口(interface)。让我们调用一个有代表性的 Repository IFooRepository:

public interface IFooRepository
{
Foo Read(int id);
}

听起来您还有与数据库对话的具体实现。为了更好的衡量,让我们给出具体的类 Inspection Properties , 这样我们就可以查询存储库对象以询问它使用哪个连接字符串:

public class SqlFooRepository : IFooRepository
{
private const string connectionString;

public SqlFooRepository(string connectionString)
{
if (connectionString == null)
throw new ArgumentNullException("connectionString");

this.connectionString = connectionString;
}

public string ConnectionString
{
get { return this.connectionString; }
}

public Foo Read(int id)
{
// SQL query code goes here...
}
}

这使您能够创建装饰器(或者可能是 Decoraptor ):

public class ConnectionstringAwareFooRepository : IFooRepository
{
private SqlFooRepository repo;

public Foo Read(int id)
{
var connectionstring =
ConfigurationManager.ConnectionStrings["foo"].ConnectionString;

if (this.repo == null ||
this.repo.ConnectionString != connectionString)
this.repo = new SqlFooRepository(connectionString);

return this.repo.Read(id);
}
}

这种设计的好处是它完全屏蔽了客户端代码来处理发现新连接字符串的管理方面。客户端看到的只是 IFooRepository

不过请注意,上面的示例不是线程安全的。如果您需要在多线程环境中使用此解决方案,则需要使其成为线程安全的。

由于 ConnectionstringAwareFooRepository 类从配置文件中读取,我强烈建议您将它放在代码库中与 Composition Root 相同的部分。 .

关于c# - 连接字符串代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34074475/

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