我一直在使用Ninject来实现使用依赖注入的应用程序。我觉得我对这些概念有了非常透彻的理解,并且非常喜欢应用程序使用DI实现的松散耦合和可测试的架构。然而,我正在努力寻找一种特定类型的服务,并且正在寻找洞察我是在做错事还是其他人遇到过同样的问题。
基本上,我最终得到了一些服务/类(一个相当小的数字),根据它们没有其他服务。因此,即使需要对类进行实例化,它也永远不会被实例化,因为它在应用程序中执行了有用的角色。例如,假设我有IMonkeyRepository
服务和IMonkeyPopulator
服务。假设IMonkeyPopulator
服务确实没有公共API,它的唯一责任(遵循单一责任原则)是发现网络上的猴子并用它们填充IMonkeyRepository
。此服务依赖于IMonkeyRepository
以及可能的其他一些服务来处理与网络的交互(例如,端口和地址的配置数据)。但是,IMonkeyPopulator
没有公共API,它只是一个空接口。
这是一个糟糕的设计还是某些我失踪的代码味?我显然可以将此功能移动到存储库本身,但这似乎违反了SRP(存储库具有有用的访问功能等,实际上可以由多个服务填充)。我考虑或尝试但不满意的一些方法是:
有任何想法或指导吗?
答案 0 :(得分:3)
你说IMonkeyPopulator
取决于IMonkeyRepository
,但看起来应该是另一种方式?这听起来像IMonkeyRepository
依赖于,因此可能需要注入IMonkeyPopulator
。如果你也注入了其他一些服务,但在内部,IMonkeyRepository
可以告诉IMonkeyPopulator
“开始”,以便存储库中确实存在某些东西?我可能会误解这个问题......也许我不应该这么多地纠缠:/
答案 1 :(得分:3)
因此,您的IMonkeyPopulator
是某种ActiveObject
,它在后台侦听tcp连接并将该数据写入存储库。我会从应用程序的角度说,必须启动和停止活动对象,因为您不想在构造函数中启动tcp连接。因此,您可以在绑定上使用OnActivation
和OnDeactivation
方法来启动和停止服务,如下所示:
This.Bind<IPopulatorService>().To<>().OnActivation((c, i) => i.Start()).OnDeactivation((c, i) => i.Stop())
但是,您的应用程序中仍有人必须获取/获取IPopulatorService
才能在应用程序中实例化它。我通常在这里使用引导程序模式http://www.appccelerate.com/bootstrapper.html来实现此目的。