在我正在处理的代码中,我有一个结构,其中代码的某些部分取决于当前的软件 session 。软件 session 包含多个辅助对象,这些对象是通过组合注入(inject)的依赖项。
一个例子是向其中注入(inject) IRepository,其中包含对数据存储库的访问。 IRepository 包含一个 DatabaseContext,它再次通过注入(inject)的 IDbContext 写入数据库。
SoftwareSession 是唯一注入(inject)的通用基础设施,用于一路访问数据库,充当网关。这意味着当我想将一个对象写入数据库时,例如 WriteCar,我将必须实现 3 个接口(interface)、2 个委托(delegate)给组合对象的函数和 1 个带有实现的函数。下面的代码片段对此进行了澄清。 WriteCar 签名在 3 个接口(interface)(IRepository、ISoftwareSession、IDbContext)中定义相同,2 个未实现的地方(Repository、SoftwareSession)仅调用与复合对象相关的函数,以及 1 个实际实现的地方(IDbContext)
这意味着当我想要重构、移动代码、添加功能或更改函数签名时,我始终必须为一个函数更改 6 个位置。
我认为这为提高可测试性提供了最佳环境,并且它遵循最佳实践,其中软件 session 包装对存储库的访问,存储库包装对数据上下文的访问 - 但我仍然怀疑我们是否可以有一些更好的方法来一次性编写它,或者我对下面代码中的某些概念有误解?
在架构上更易于维护的实现方式是什么?甚至可能使用某种巧妙的 lambda 或委托(delegate)方式来减少为每个新功能编写的代码量?或者甚至是一些库(例如 automapper 简化了 DTO)或工具可以使用 Visual Studio、Resharper 等通过某种模板机制轻松生成此代码?
如果我在这里遇到一些概念混淆,请告诉我。我知道我的一些同事也有类似的观点,在这种情况下,澄清其他人的误解也可能会有所帮助。
public class SoftwareSession : ISoftwareSession
{
...
IRepository repository;
public void WriteCar(Car car){
repository.WriteCar(car);
}
...
}
public interface ISoftwareSession{
...
void WriteCar(Car car);
...
}
public class Repository : IRepository{
...
IDbContext context;
public void WriteCar(Car car){
context.WriteCar(car);
}
...
}
public interface IRepository{
...
void WriteCar(Car car);
...
}
public class MyDbContext : IDbContext{
...
public void WriteCar(Car car){
//The Actual Implementation here.
...
}
...
}
public interface IDbContext{
...
void WriteCar(Car car);
...
}
最佳答案
一方面,您的 IDbContext
和IRepository
是相同的。您可能想删除 IDbContext
,或者至少删除 IRepository
中声明的方法来自它。
然后,MyDbContext
和Repository
将实现IRepository
和Repository
类只是 MyDbContext
的包装。 .
那么,如果 Repository
仅将调用转接至MyDbContext
,那么您可能也不需要该类。
此外,我没有看到您在 SoftwareSession
中执行任何操作除了将调用转发到包含的存储库之外。您真的需要SoftwareSession
,或者通过 IRepository
有意义吗?直接发送给调用 session 对象的人?
底线是这个实现充斥着重复和转发。删除它,你的整个模型就会变得简单。
关于c# - 简化 C# 中的组合接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42230211/