在前面使用Topshelf的文章里,我们的工作类TownCrier使用的是无参数的构造函数,满足测试的目的。在实际的开发过程中,我们常常需要使用带有参数的构造函数,就不可避免的使用Ioc的技术。在这里我们使用的是Topshelf.Autofac这个开源框架

1.安装Topshelf.Autofac 

install-package Topshelf.Autofac -Version 3.1.

2.创建带有参数的TownCrier构造函数类

    public class TownCrier
{
readonly Timer _timer;
private AM am;
public TownCrier(AM parameter)
{
am = parameter;
_timer = new Timer() { AutoReset = true };
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);
}
public void Start() { _timer.Start(); }
public void Stop() { _timer.Stop(); }
} public class AM
{
public string Name { get; set; }
}

这里纯粹是为了进行测试,AM类没有任何其他方法,但可以达到测试的目的。

3.配置Ioc

public static void TestIoc()
{
// Autofac
var builder = new ContainerBuilder();
builder.RegisterType<TownCrier>();
builder.RegisterType<AM>();
var container = builder.Build(); var rc = HostFactory.Run(x => //
{
x.Service<TownCrier>(s => //
{
s.ConstructUsing(() => container.Resolve<TownCrier>()); //
s.WhenStarted(tc => tc.Start()); //
s.WhenStopped(tc => tc.Stop()); //
});
x.RunAsLocalSystem(); // x.SetDescription("Sample Topshelf Host"); //
x.SetDisplayName("Stuff"); //
x.SetServiceName("Stuff"); //
}); // var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); //
Environment.ExitCode = exitCode;
}

代码中的红色版本是配置的主要地方,简单2点,一是将涉及到的类,通过RegisterType方法注册进来。二是ConstructUsing函数使用函数表达式container.Resolve方法注册我们的工作类TownCrier。

在测试这段代码的时候,遇见的问题是根据官方提供的demo案例是不对的,根本没有对应的方法,可能是不同版本或者github网站代码和nuget安装代码不是同一份的缘故,反正这里是一个坑。以下是官方Demo:

static void Main(string[] args)
{
// Create your container
var builder = new ContainerBuilder();
builder.RegisterType<SampleDependency>().As<ISampleDependency>();
builder.RegisterType<SampleService>();
var container = builder.Build(); HostFactory.Run(c =>
{
// Pass it to Topshelf
c.UseAutofacContainer(container); c.Service<SampleService>(s =>
{
// Let Topshelf use it
s.ConstructUsingAutofacContainer();
s.WhenStarted((service, control) => service.Start());
s.WhenStopped((service, control) => service.Stop());
});
});
}

以上代码测试通过之后,就对Topshelf.Autofac的依赖注入有了基本了解,就可以着手自己实际业务的Ioc处理了。

实际项目中的应用代码案例:

        public static void RunService()
{
// IOC Autofac
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly.Load("HengShen.Pts.Domain")).Where(i => i.Namespace == "HengShen.Pts.Domain.Services");
builder.RegisterAssemblyTypes(Assembly.Load("HengShen.Pts.Domain")).Where(i => i.Namespace == "HengShen.Pts.Domain.TopshelfSevice");
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
builder.RegisterType<SqlUowDbContext>().As<ISqlUnitOfWork>();
var container = builder.Build(); var rc = HostFactory.Run(x => //
{
try
{
x.Service<WavePlanSyncService>(s => //
{
s.ConstructUsing(() => container.Resolve<WavePlanSyncService>());
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem(); // x.SetDescription("Sample Topshelf Host"); //
x.SetDisplayName("Stuff"); //
x.SetServiceName("Stuff"); //
}
catch(Exception ex)
{
string m = ex.Message;
}
}); // var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); //
Environment.ExitCode = exitCode;
}

考虑到以后还会有新的task加入,这里就不在一个个的去注册Service类,而是通过程序集的方式将所有的Service一起注册进来,而这些Service类又依赖Repository,所以也将对应的泛型形式注册进来,SqlUowDbContext是Repository要使用的,所以也注册进来。在测试的时候,使用了以下方式的代码,程序报错。原因是这里我们使用的是控制台程序,没有网络请求

builder.RegisterType<SqlUowDbContext>().As<ISqlUnitOfWork>().InstancePerRequest();

改正后的代码是

builder.RegisterType<SqlUowDbContext>().As<ISqlUnitOfWork>();

再编译运行,程序不在出错,打印出我们预先设定的内容,IOC依赖注入处理就此完毕。

Topshelf的Ioc实现的更多相关文章

  1. 【框架学习与探究之定时器--Hangfire】

    声明 本文欢迎转载,请注明文章原始出处:http://www.cnblogs.com/DjlNet/p/7603632.html 前言 在上篇文章当中我们知道关于Quartz.NET的一些情况,其实博 ...

  2. 使用Topshelf 开发windows服务

    在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发.如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 ...

  3. TopShelf 自动配置Service测试

    在开发中经常会遇到后台定时处理数据和任务的情况,处理这些事情大概有以下几种方案: 1.使用数据库的job功能.优点是在数据库中可以完成的就在数据库中完成,配置等基础设施数据库都提供,简单快捷.缺点是如 ...

  4. Topshelf+Quartz.net+Dapper+Npoi(一)

    背景 前段时间公司有个需求(每天给业务导出一批数据,以excel的形式通过邮件发送给他).A说:直接写个服务,判断等于某个时间点,执行一下sql语句,生成excel,写个EmaiHelper发送给他不 ...

  5. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  6. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  7. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  8. 自己实现简单Spring Ioc

    IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外 ...

  9. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

随机推荐

  1. 对比学IT---路由器和linux流量统计的差别

    1. 路由器使用MQC来统计端口入出方向,特定特征的数据流. 显示policy 的统计信息 配置policy: #traffic classifier vlan5traffic operator an ...

  2. Python 再谈变量作用域与变量引用

    再谈变量作用域与变量引用 by:授客 QQ:1033553122 module3.py #!/usr/bin/env python # -*- coding:utf-8 -*-   __author_ ...

  3. Kotlin入门(3)基本变量类型的用法

    上一篇文章介绍了Kotlin在App开发中的简单用法,包括操纵控件对象.设置控件监听器,以及弹出Toast提示等等.也许大家已经迫不及待想要了解更深入的App开发,可是由于Kotlin是一门全新的语言 ...

  4. c#权限验证

    在开发过程中,需要对访问者的身份做权限验证(再filter中进行权限过滤). 在每次进入控制器方法之前进行调用:如 [ControllerAuth] [RoutePrefix("Clinic ...

  5. 几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比

    AJAX是web2.0的基石,现在网上流行几种开源的AJAX框架,比如:jQuery,Mootools,Dojo,Ext JS等等,那么我们到底在什么情况下该使用那个框架? 让我们来想想选择AJAX框 ...

  6. AspNet Core2 浏览器缓存使用

    Core2中使用Microsoft.AspNetCore.Mvc下的ResponseCacheAttribute特性来控制Http Get请求的缓存 原理是设置http请求 响应头的Cache-con ...

  7. C#语言————选择结构

    int[] num = new int[] {23,76,54,87,51,12 }; //冒泡排序 for (int i = 0; i < num.Length - 1; i++) { for ...

  8. .net core HttpContext(Http上下文)

    在.NET Core中,只有Controller才能直接使用 HttpContext ,其他地方需要通过HttpContextAccessor来访问

  9. Android QMI机制

    android QMI机制---概论 android QMI机制---QMUX android QMI机制---Qcril初始化流程 android QMI机制---QCRIL消息发送 android ...

  10. vmware linux 虚拟机开机状态加硬盘

    在开机状态先加一块盘,如图: 在系统中查看当前硬盘状态: 新加的硬盘还没刷出来.执行如下命令再试一下: $ echo "- - -" >/sys/class/scsi_hos ...