C# 使用三个.NET类库进行循环引用-可能还是愚蠢?
我在这里读过关于循环参考文献的其他问题,但我找不到我问题的答案 我有三个类库:身份验证、EmailService和ExceptionService 身份验证控制用户登录到各种应用程序,EmailService发送电子邮件,ExceptionService将错误/异常记录到数据库 目前,身份验证引用EmailService和ExceptionService来使用它们的功能,这是可行的。ExceptionService引用EmailService来发送报告电子邮件。一切都很好 我想知道的是,以下是否可行/明智/愚蠢,以及是否有更好的方法:C# 使用三个.NET类库进行循环引用-可能还是愚蠢?,c#,asp.net-mvc,reference,class-library,C#,Asp.net Mvc,Reference,Class Library,我在这里读过关于循环参考文献的其他问题,但我找不到我问题的答案 我有三个类库:身份验证、EmailService和ExceptionService 身份验证控制用户登录到各种应用程序,EmailService发送电子邮件,ExceptionService将错误/异常记录到数据库 目前,身份验证引用EmailService和ExceptionService来使用它们的功能,这是可行的。ExceptionService引用EmailService来发送报告电子邮件。一切都很好 我想知道的是,以下是否
- 我希望EmailService能够使用ExceptionService的功能,以便报告EmailService中的任何错误。从理论上讲,这可能意味着ExcpetionService会回调EmailService以发送报告电子邮件,这可能会触发相同的错误,因此我必须编写一个仅由EmailService使用的方法,该方法不发送电子邮件,只记录邮件
- ExceptionService仍应引用EmailService
- 身份验证类库还应同时使用这两种服务
非常感谢您的帮助:)出现问题的原因是,您的类是紧密耦合的,当您尝试创建循环耦合时,编译器会非常明显地感到不安。您可以通过为您的服务创建接口并将一个服务的接口实例提供给另一个服务的实现来解决这个问题,反之亦然
不过,一个更好的解决方案是停止重新发明轮子,使用现有的日志框架。两者都可以满足您的日志记录和电子邮件发送需求。出现问题的原因是您的类紧密耦合,当您尝试创建循环耦合时,编译器会非常明显地感到不安。您可以通过为您的服务创建接口并将一个服务的接口实例提供给另一个服务的实现来解决这个问题,反之亦然
不过,一个更好的解决方案是停止重新发明轮子,使用现有的日志框架。两者都可以满足您的日志记录和电子邮件发送需求。出现问题的原因是您的类紧密耦合,当您尝试创建循环耦合时,编译器会非常明显地感到不安。您可以通过为您的服务创建接口并将一个服务的接口实例提供给另一个服务的实现来解决这个问题,反之亦然
不过,一个更好的解决方案是停止重新发明轮子,使用现有的日志框架。两者都可以满足您的日志记录和电子邮件发送需求。出现问题的原因是您的类紧密耦合,当您尝试创建循环耦合时,编译器会非常明显地感到不安。您可以通过为您的服务创建接口并将一个服务的接口实例提供给另一个服务的实现来解决这个问题,反之亦然 不过,一个更好的解决方案是停止重新发明轮子,使用现有的日志框架。两者都可以满足您的日志记录和电子邮件发送需求。(我暂时忽略AuthenticationService,因为它只会混淆问题—您所拥有的是两个服务之间的简单循环依赖关系—异常和电子邮件) 解决这些循环依赖性问题的最佳方法是使用接口层和存储库 假设您有两个类,
EmailService
和ExceptionService
。它们不能引用彼此的DLL,所以您要做的是创建第三个程序集,接口
,并为它们创建两个接口,IEmailService
和IEExceptionService
。现在,您的两个类都只能引用该共享接口程序集
使用某种机制,您的电子邮件服务
会获得对IEExceptionService
的引用,反之亦然,因此循环被打破
一个简单的IoC机制是服务定位器模式。创建此(简化)对象:
现在,您的EmailService在启动时可以向ServiceLocator注册自己,并允许其他类获取对它的引用,而不依赖于其程序集
当然,大多数IoC解决方案都有更多的功能,但这是基本思想——通过将共享接口提取到共享程序集中来防止循环依赖,并且只引用它。(我现在忽略AuthenticationService,因为它只会混淆这个问题——您拥有的是两个服务之间的简单循环依赖关系——异常和电子邮件)
解决这些循环依赖性问题的最佳方法是使用接口层和存储库
假设您有两个类,EmailService
和ExceptionService
。它们不能引用彼此的DLL,因此,您需要创建第三个程序集,Interfaces
,并为它们创建两个接口,IEmailService
和IEx
public class ServiceLocator
{
public static IEmailService EmailService {get;set;}
public static IExceptionService ExceptionService {get;set;}
}