在具有多个类的接口中,类不能实现相同子接口的最佳方法是什么?

时间:2020-07-05 12:47:55

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

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

例如:

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
   }
}

也许您有一个完全不同但更好的方法,请告诉我!我感谢代码示例:)

1 个答案:

答案 0 :(得分:3)

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

由于FooService将强制执行所有方法,因此您可以调用ReadBar()而不是_barService.ReadBar(),因为您已经具有从所有其他接口继承的IFooService,因此无需进行合成。

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

相关问题