【问题标题】:What is the best way to use an Interface with multiple classes where classes don't implement the same subinterfaces?在类不实现相同子接口的情况下,使用具有多个类的接口的最佳方法是什么?
【发布时间】:2020-10-25 16:22:57
【问题描述】:

我正在尝试为每个逻辑类创建一个通用服务接口以与数据库通信。 请参阅代码示例以获得比文字更好的解释。

例如:

Foo

public interface ICreateFoo 
{
     void CreateFoo(Foo foo);
}

public interface IReadFoo 
{
     void ReadFoo(Foo foo);
}

条形

public interface ICreateBar
{
     void CreateBar(Bar bar);
}

public interface IReadBar 
{
     void ReadBar(Bar bar);
}

IFooService

public interface IFooService : ICreateFoo, IReadFoo, IReadBar
{ }

FooService 实例

public class FooService : ICreateFoo, IReadFoo
{
   public void CreateFoo(Foo foo){
       //Something
   }

   public void ReadFoo(Foo foo){
       //Something
   }
}

BarService 实例

public class BarService : ICreateBar, IReadBar 
{
   public void CreateBar(Bar bar){
       //Something
   }

   public void ReadBar(Bar bar){
       //Something
   }
}

FooLogic 实例

public class FooLogic : IFooService
{
   private readonly IFooService _fooService;

   public FooLogic(IFooService fooService) {
       _fooService = fooService;
   }

   public void CreateFoo(Foo foo){
       //Check if bar exists
       if(_fooService.ReadBar())
           _fooService.AddFoo(foo);
       else
         //nothing
   }
}

但是依赖注入当然不知道它应该得到哪个service 类实例,这是对接口的不好使用吗?因为它对我来说看起来很干净,但我还不知道如何实现。

我想出这个的原因是因为在将 Foo 添加到数据库之前我需要知道 Bar 是否存在。我想要根据 SOLID 原则的课程(每个课程都有自己的职责)。还是将每个服务注入Logic中更好,如下所示:

public class FooLogic
{
   private readonly IFooService _fooService;
   private readonly IBarService _barService;

   public FooLogic(IFooService fooService, IBarService barService) {
       _fooService = fooService;
       _barService = barService;
   }

   public void CreateFoo(Foo foo){
       //Check if bar exists
       if(_barService.ReadBar())
           _fooService.AddFoo(foo);
       else
         //nothing
   }
}

也许你有一个完全不同但更好的方法,让我知道!我很欣赏代码示例:)

【问题讨论】:

  • "一个类没有实现接口的所有方法" -> 这不是 c# 中的选项。一个接口是全有或全无。
  • 嗯,当你阅读这篇文章时,它并不完全准确,但我不知道如何准确表达......

标签: c# dependency-injection interface solid-principles single-responsibility-principle


【解决方案1】:

保持简单! 创建实现 IFooService 的 FooService。 FooLogic 应该被删除。您可以在 CreateFoo 方法中实现逻辑。

由于 FooService 将实现所有方法,因此您可以调用 ReadBar() 而不是 _barService.ReadBar(),无需组合,因为您已经拥有从所有其他接口继承的 IFooService。

这样,我们仍然尊重依赖注入模式。

【讨论】:

    猜你喜欢
    • 2015-07-24
    • 2014-11-14
    • 1970-01-01
    • 2014-10-25
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多