gpt4 book ai didi

c# - 如何在不依赖于实现的情况下使用接口(interface)的实现?

转载 作者:行者123 更新时间:2023-11-30 15:21:43 24 4
gpt4 key购买 nike

我正在尝试使用我从研究 SOLID 原则中获得的知识来制作一个简单的 ASP.NET Webform。

我已经将我的解决方案设置为 3 个项目:主要的 asp.net webforms 项目、Data Access Interfaces 类库项目和 Data Access 类库项目(它具有 Data Access Interfaces 项目中接口(interface)的实现)。

我在 Data Access Interfaces 程序集中有一个 ICoinStorage 接口(interface),看起来像这样(Coin 只是一个位于数据访问接口(interface)程序集):

public interface ICoinStorage
{
void Persist(IEnumerable<Coin> coins);
}

该接口(interface)的实现在名为 CoinSqlServerStorageData Access 程序集中使用 ADO.NET,如下所示:

public class CoinSqlServerStorage : ICoinStorage
{
private string sqlConnectionString;

public CoinSqlServerStorage(string connectionStringName)
{
sqlConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
}

public void Persist(IEnumerable<Coin> coins)
{
using (var connection = new SqlConnection(sqlConnectionString))
using (var command = new SqlCommand() { Connection = connection })
{
foreach (var coin in coins)
{
command.Parameters.AddWithValue("@Name", coin.Name);
command.Parameters.AddWithValue("@Weight", coin.Weight);
command.Parameters.AddWithValue("@Thickness", coin.Thickness);
command.Parameters.AddWithValue("@Value", coin.Value);
command.Parameters.AddWithValue("@Condition", (int)coin.Condition);

command.CommandText = "INSERT INTO Coins (Name, Weight, Thickness, Value, ConditionID) " +
"VALUES (@Name, @Weight, @Thickness, @Value, @Condition);";

command.Connection.Open();
command.ExecuteNonQuery();
}
}
}
}

我的问题是:如何在 webforms 项目中使用 CoinSqlServerStorage 类而不创建对 Data Access 的依赖程序集? 我想这样做,以便用户可以访问 InsertCoin.aspx 页面来定义新硬币并将新硬币存储在数据库中...

当我准备在 InsertCoin.aspxPage.Load 事件中创建 CoinSqlServerStorage 类的实例时,我的问题出现了页面,但意识到这将创建对 Data Access 程序集的依赖,而不是仅仅依赖于 Data Access Interfaces 程序集...

我该如何继续?

最佳答案

在这种情况下,您可以再创建一个项目并调用它,例如 Data Access DI,它将引用 Data AccessData Access Interfaces项目。该项目将负责为所有其他项目(将需要)提供所需的数据访问接口(interface)实现。

但即使在这种情况下,您也会有两个依赖项:Data Access InterfacesData Access DI - 第一个将提供接口(interface),第二个 - 将提供实现。

这个Data Access DI 项目会将您的其他项目与实现隔离开来,即使您会有多个Data Access Whatever 项目,例如:Data Access Mongo, Data Access Sql, Data Access Raven

关于c# - 如何在不依赖于实现的情况下使用接口(interface)的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959587/

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