没有依赖服务的 DI 服务

本文关键字:服务 DI 依赖 | 更新日期: 2023-09-27 17:54:13

我一直在与Ninject合作,使用依赖注入来实现一个应用程序。我觉得我对这些概念有相当透彻的理解,并且非常喜欢应用程序使用 DI 实现的松散耦合和可测试的体系结构。但是,我正在为一种特定类型的服务而苦苦挣扎,并且正在寻找有关我是否做错了什么或其他人是否遇到过同样的事情的见解。

基本上,我最终得到了一些服务/类(相当少的数量(,它们没有其他服务依赖于它们。因此,该类永远不会被实例化,即使它是必需的,因为它在应用程序中执行有用的角色。例如,假设我有一个IMonkeyRepository服务和一个IMonkeyPopulator服务。假设IMonkeyPopulator服务确实没有公共 API,它的唯一责任(遵循单一责任原则(是发现网络上的猴子并用它们填充IMonkeyRepository。此服务依赖于IMonkeyRepository,也许还依赖于一些其他服务来处理其与网络的交互(例如,端口和地址的配置数据(。但是,IMonkeyPopulator没有公共 API,它只是一个空接口。

这是一个糟糕的设计还是我缺少的某种代码气味?我显然可以将此功能移动到存储库本身,但这对我来说似乎违反了 SRP(存储库具有有用的访问功能等,并且实际上可以由多个服务填充(。我考虑过或尝试过但不满意的一些方法是:

  1. 使服务具有单个公共方法(如 Start(,必须调用该方法才能开始工作。这样做的缺点是需要确定系统中的任意位置才能进行此调用。
  2. 将服务绑定到我在创建 Ninject 内核时实例化的常量。这要求我了解没有人依赖这项服务,因此必须对其进行特殊处理,这似乎是错误的。
  3. 向服务添加一些成员,并在应用程序中的某个位置创建一个 GUI 来读取这些值(例如服务的状态等(。显然,必须向我的应用程序添加一个仅出于此原因的 GUI 是非常愚蠢的(尽管有时对调试等很有用(。

有什么想法或指导吗?

没有依赖服务的 DI 服务

你说IMonkeyPopulator取决于IMonkeyRepository,但似乎应该是相反的? 听起来您的IMonkeyRepository依赖于,因此可能需要注射IMonkeyPopulator。 如果您也注入了一些其他服务,但在内部,IMonkeyRepository可以告诉IMonkeyPopulator"启动",以便存储库中实际上有一些东西? 不过我可能误解了这个问题...也许我不应该那么胡闹:/

因此,

您的IMonkeyPopulator是某种ActiveObject,它在后台侦听 tcp 连接并将该数据写入存储库。我会从应用程序的角度来看,必须启动和停止活动对象,因为您不想在构造函数中启动 tcp 连接。因此,可以使用绑定上的OnActivationOnDeactivation方法来启动和停止服务,如下所示:

 This.Bind<IPopulatorService>().To<>().OnActivation((c, i) => i.Start()).OnDeactivation((c, i) => i.Stop())

但是,应用程序中仍然必须有人获取/获取IPopulatorService才能将其实例化到应用程序中。我通常在这里使用引导程序模式 http://www.appccelerate.com/bootstrapper.html 以实现这一点。