使用.net core

时间:2018-01-25 11:28:42

标签: c# dependency-injection asp.net-core .net-core

我在.net核心网络应用中遇到循环依赖项引用错误的问题。 虽然我认为我理解这个问题,但我无法想到解决我面临的问题,我已经四处寻找并且似乎也找不到其他人遇到同样的问题。

这是我想要实现的逻辑流程: 1.通用存储库处理db CRUD操作。 2.在此存储库中是一种服务,它根据发生的数据库操作的类型执行某些任务。

示例1  新记录将插入到用户表中,有一项任务会向用户触发欢迎电子邮件。

示例2 引导线插入数据库,有一个任务为系统管理员创建后续任务。

这一切都以这种通用方式处理的原因是我想为应用管理员提供一个界面来创建/更新这些触发器任务,因此在示例1中为什么我不只是硬编码给用户的电子邮件

我正在使用DI来解决各种服务,我遇到的问题如下:

EntityFrameworkRepository实现IRepository enter image description here

TriggerService构造函数 enter image description here

ITriggerService被注入EntityFrameworkRepository,错误被触发,因为我尝试在触发器服务中注入并解析IRepository,即使没有注入,templateService也会尝试在自己的构造函数中解析IRepository。在那一刻我只是编写了ITempalteService和IEmailerService,但是会有很多其他的“触发操作服务”,这些服务也会在整个代码和其他服务中使用,所以我真的不想改变这些设计。

我认识到这是一个糟糕的设计,基于所有其他人提出了类似问题和他们收到的回复,我无法弄清楚如何解决/设计正确的解决方案以实现预期的目标。 / p>

欢迎所有建议!

1 个答案:

答案 0 :(得分:0)

一般来说,存储库应该只执行愚蠢的CRUD操作,没有任何业务逻辑。当然,在插入记录时发送邮件并创建后续任务是业务逻辑。

想象一下,您需要允许插入记录而不发送欢迎邮件,因为引入了新的用例,并且此类用例与初始意图无关。一个简单的例子是一种不需要接收通知的用户。换句话说,如果您使用存储库操作硬连接某些业务逻辑,则在必要时您将无法将其分离。

思考问题的正确方法是将其重新定义,将混合repo +业务逻辑转换为纯粹的业务逻辑:

  1. 将新记录插入用户表,有一项任务会向用户触发欢迎电子邮件。 => 注册了新用户,有一项任务会向用户触发欢迎电子邮件。
  2. 将潜在客户插入数据库,有一项任务可为系统管理员创建后续任务。 => 创建潜在客户,有一项任务可为系统管理员创建后续任务。
  3. 谈到代码,我的建议是添加一个中间服务,调用存储库来执行裸CRUD 调用提供所需副作用的服务。

    考虑你的第一个例子(类似的第二个),而不是直接调用>>> seq = 'attctgta' >>> for i in seq[:-2]: ... if seq[i*3] == 'a' and seq[i*3+1] == 't' and seq[i*3+2] == 't': ... print 'I' Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: string indices must be integers, not str 来插入用户记录,而是在呼叫者中注入一个新的pip install sgp4 ,然后接收IRepository }和IUserService在其构造函数中并调用它们。这样您就可以毫无困难地将IRepository注入IEmailerService

    我唯一不能告诉你的是我的建议是否可以根据你提供一般界面的需要来应用。无论如何,应用这种变化所需的重构应该是最小的,当然,循环依赖问题(由原始公式中的循环性引起)得到解决。

相关问题