c# - 简化 C# 中的组合接口(interface)

标签 c# oop design-patterns dependency-injection delegation

在我正在处理的代码中,我有一个结构,其中代码的某些部分取决于当前的软件 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);
    ...
}

最佳答案

一方面,您的 IDbContextIRepository是相同的。您可能想删除 IDbContext ,或者至少删除 IRepository 中声明的方法来自它。

然后,MyDbContextRepository将实现IRepositoryRepository类只是 MyDbContext 的包装。 .

那么,如果 Repository仅将调用转接至MyDbContext ,那么您可能也不需要该类。

此外,我没有看到您在 SoftwareSession 中执行任何操作除了将调用转发到包含的存储库之外。您真的需要SoftwareSession ,或者通过 IRepository 有意义吗?直接发送给调用 session 对象的人?

底线是这个实现充斥着重复和转发。删除它,你的整个模型就会变得简单。

关于c# - 简化 C# 中的组合接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42230211/

相关文章:

c# - 实现接口(interface)还是 double 的泛型?

c# - 启动时对象初始化的模式

java - 创建类的新实例的不同方法?

c++ - 工厂的工厂?

c# - 属性窗口不会显示第三级嵌套组件的事件,除非第二级嵌套组件有事件

c# - 是否可以将音频文件和C#文件一起编译为单个exe?

c# - 需要一些帮助来破译正则表达式

php - 记忆 PHP 上的链式方法

使用请求与上下文的身份验证

c# - C# 中的双向适配器和可插拔适配器模式有什么区别?