没有相关服务的DI服务

时间:2013-01-17 03:18:30

标签: c# dependency-injection inversion-of-control ninject ninject-2

我一直在使用Ninject来实现使用依赖注入的应用程序。我觉得我对这些概念有了非常透彻的理解,并且非常喜欢应用程序使用DI实现的松散耦合和可测试的架构。然而,我正在努力寻找一种特定类型的服务,并且正在寻找洞察我是在做错事还是其他人遇到过同样的问题。

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

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

  1. 使服务具有单个公共方法,例如Start,必须调用它才能开始工作。这样做的缺点是需要在系统中确定一个有点任意的位置才能进行此调用。
  2. 将服务绑定到我在创建Ninject内核时实例化的常量。这要求我明白没有人依赖这项服务所以必须专门处理,这似乎是错误的。
  3. 将一些成员添加到服务中,并在我的应用程序中的某个位置创建一个GUI来读取这些值(例如服务的状态等)。显然,由于这个原因,必须在我的应用程序中添加一个GUI是非常愚蠢的(虽然有时对调试有用等)。
  4. 有任何想法或指导吗?

2 个答案:

答案 0 :(得分:3)

你说IMonkeyPopulator取决于IMonkeyRepository,但看起来应该是另一种方式?这听起来像IMonkeyRepository依赖于,因此可能需要注入IMonkeyPopulator。如果你也注入了其他一些服务,但在内部,IMonkeyRepository可以告诉IMonkeyPopulator“开始”,以便存储库中确实存在某些东西?我可能会误解这个问题......也许我不应该这么多地纠缠:/

答案 1 :(得分:3)

因此,您的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来实现此目的。