用Windows服务手动实现IoC

本文关键字:实现 IoC Windows 服务 | 更新日期: 2023-09-27 18:03:23

我是IoC的新手,因此一直在遵循Jeffery Palermo在http://jeffreypalermo.com/blog/the-onion-architecture-part-1/上的帖子和他在https://github.com/jeffreypalermo/mvc2inaction/tree/master/manuscript/Chapter23上的书中提供的示例

最重要的是要注意,我没有使用预滚动的IoC容器,主要是因为我想了解所有的移动部分。

然而,我正在创建一个windows服务而不是ASP。. NET MVC web应用程序,所以我有点陷入了启动部分。特别是在网络上。配置他在基础设施项目内部注册一个IHttpModule实现作为启动模块,然后使用post-build事件将必要的dll复制到网站目录中,以绕过对web项目本身的直接依赖。

我不认为我在一个真正的windows服务中有这种奢侈,所以我如何实现类似的东西,我应该有一个小型的启动项目,它依赖于基础设施和核心,或者有另一种方法来绕过windows服务的编译时限制?

用Windows服务手动实现IoC

基于这个问题(c#)的标签,我假设你将通过派生ServiceBase来实现Windows服务。如果是这样,OnStart方法将是你的组合根 -这是你组合应用程序的对象图的地方。完成对象图的合成后,合成结束,由合成对象图接管。

在OnStop中,您可以再次停用对象图。

没有什么可以阻止您在单独的程序集中实现已解析对象图的各种组件。这就是我要做的

我想你误解了IoC框架的作用。

回答你的问题

但是引用不意味着依赖关系吗?

是的,但在另一个层面上。IoC是关于类之间的依赖关系。不是在类中使用new Something(),而是提供一个需要所有依赖接口的构造函数。这样,类就无法控制传递给它的实现。这就是控制反转。IoC容器只是一个辅助工具,帮助以一种良好的方式管理依赖关系。

假设您有一个ICustomerNotificationService接口,其实现类似

public class MailNotificationService : INotificationService
{
    IMailerService _mailer;
    ICustomerRepository _customerRepo;
    IOrderRepository _orderRepo;
    public MailNotificationService(IMailerService mailer, 
                                   ICustomerRepository customerRepo, 
                                   IOrderRepository oderRepo)
    {
        // set fields...
    }
    public void Notify(int customerId, int productId)
    {
        // load customer and order, format mail and send.
    }
}

因此,如果您的应用程序请求ICustomerNotificationServcie的实例,容器计算出采取哪些具体实现并尝试满足所请求类的所有依赖项。

优点是你可以很容易地在你的引导逻辑中配置所有的依赖关系,并且能够很容易地改变你的应用程序的行为。

例如,在测试时,您使用IMailerService实现启动应用程序,该实现将邮件写入文件,并在生产模式下连接真正的邮件服务。如果你在构造函数中添加一个MailerService,而不是将其作为参数,这将是不可能的。

一个好的IoC容器可以处理更多的事情,比如生命周期管理、单例、扫描程序集寻找你想要注册的类型等等。例如,我们的整个插件系统是基于Structure Map的。

你可能想看看这篇博客文章和它的第二部分。