C# 为两个项目保留一个与相同功能相关的服务类,或为每个项目创建两个

C# 为两个项目保留一个与相同功能相关的服务类,或为每个项目创建两个,c#,architecture,layer,C#,Architecture,Layer,场景:我在一个解决方案中有两个项目用于发送电子邮件。其中一个项目是允许将电子邮件保存到数据库中的库。第二个是windows服务应用程序,它通过发送电子邮件并对其执行一些其他操作来处理这些电子邮件。对于这个场景,让我们称它们为Core&WS 结构:应用程序(核心,WS)->服务->存储库->数据库 问题:我想保持一切清晰,并以最佳方式进行。现在我有一个处理电子邮件的服务层。操作很简单:AddEmail、GetAllEmails、MarkAsSent。因此,所有这些操作都与数据库中的同一个表相关。这

场景:我在一个解决方案中有两个项目用于发送电子邮件。其中一个项目是允许将电子邮件保存到数据库中的库。第二个是windows服务应用程序,它通过发送电子邮件并对其执行一些其他操作来处理这些电子邮件。对于这个场景,让我们称它们为Core&WS

结构:应用程序(核心,WS)->服务->存储库->数据库

问题:我想保持一切清晰,并以最佳方式进行。现在我有一个处理电子邮件的服务层。操作很简单:AddEmail、GetAllEmails、MarkAsSent。因此,所有这些操作都与数据库中的同一个表相关。这只是一个服务级别。因此,我通过Core&WS共享该服务。然而,我想知道这是否是一个好方法?因为我想有人谁会使用我的核心将有明确的情况。他只需要使用一种方法“AddEmail”。其余的都与WS有关,他不需要为它们操心。 我创建了Web应用程序并引用了核心库,然后使用了这个AddEmail方法。但我也能使用其他方法

问题
1.我是否应该将此服务类和存储库类拆分为:CoreService、CoreRepository、WsService、WsRepository?如果是这样的话,我将解决我的问题,但是我将在两个项目上分离相同功能的逻辑(电子邮件队列-相同的表)。我正在尝试为每个类创建存储库。然后,我将在不同的项目中使用两个相同的服务,但使用不同的方法集

2.如果我想添加另一个WindowsService,该怎么办。只需要使用GetAllEmails方法的一个。例如,在显示器上显示要发送的所有电子邮件。然后我应该为这个服务创建第三个项目吗?然后到第三次,同样的服务,但只有一种方法?与WindowsService类相比,这甚至是一个重复。如下图所示:

WindowsService(用于处理电子邮件):EmailQueueService.cs->GetAllEmails、MarkAsSent、MarkAsFailure..

WindowsService(显示的电子邮件队列):EmailQueueService.cs->GetAllEmails


在另一种情况下,像现在这样由三个不同项目共享的所有内容看起来都不是一个合适的解决方案。


提前感谢您的帮助。

@codedward,如果我正确理解了您的问题,您基本上有一个管理电子邮件的类-

AddEmail,GetAllEmails,MarkAsSent

您有一个web应用程序,您只想公开AddEmail方法,而不想看到其他方法,反之亦然。在这种情况下,如果您是库作者(将创建和维护电子邮件服务类的人),并且无法控制如何使用它,那么您可以简单地依赖封装,这意味着您应该隐藏您的实现细节

实际上,您可以有两个接口,一个只公开AddEmail,另一个公开其余方法。您可以在同一个核心服务类上实现这两个接口。在此之后,您现在可以从库(类库项目)中公开这些接口,将核心服务(实现这些接口的服务)隐藏起来,并且仅在核心项目/Dll/library中可见

您的调用代码现在可以依赖于他们所需要的接口,该技术/设计原则是“依赖倒置”


希望这能回答您的疑问

Hi@codeeward。你能把这个问题也总结一下吗。不是每个班级需要做什么,而是你最终想要达到什么。当然是@preethingh。然而,用两句话来概括这一点并不是那么容易,因为我的问题很复杂,但我可以试着重述一切。我想要两个应用程序-类库(名为Core)和windows服务(名为WS)。他们应该共享同一个服务类,还是我应该创建两个单独的服务类——每个服务类中都有一个?有关问题的更多详细信息,请参阅根帖子。谢谢您的回答。但是,如果我隐藏了具体的类并使其仅在我的库中可见,我将无法在任何希望包含此库的不同项目中使用IoC,因为它不会看到此类。“有什么办法解决这个问题吗?”codeedward不太明白这个评论。您是否希望在引用接口的项目中引用包含实现的库?没错。我不允许引用Mailer的Project1使用WS中的任何方法,只允许从Core中使用这些方法。若存储库层是公共的,并且我将这个类限制为内部的,那个么我将无法在我的引导容器中创建它。在那个里,我需要创建一个类是具体实现的地方。因为这个实现是通用的,但是是内部的,所以我不能显式地键入它。我不能,因为Project1与引用的核心库不同。这有什么意义吗?