在前面使用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. 简单的TabLayout+Fragment选项卡

    TabLayout属性: app:tabIndicatorColor="#fff"  //下方滚动的下划线颜色 app:tabIndicatorHeight="10dp& ...

  2. http协议及长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  3. 【HANA系列】SAP HANA XS的JavaScript API详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS的Java ...

  4. sysbench对MySQL的压测,使用sysbench压测磁盘io

    QPS - query per secondTPS - transaction per second 不是特别关注,每个业务场景中事务标准是不一样的 Ⅰ.sysbench测试框架 Ⅱ.常用测试脚本 [ ...

  5. Selenium 、WebDriver :Capability

    Selenium | WebDriver Capability 内容摘要: 1.WebDriver 通用配置 2.RemoteWebDriver特有配置 3.Grid特有配置 4.在使用特定浏览器时的 ...

  6. python 计时累积超过24小时时继续往上累加

    最近在做一个工具,要求在工具上面加上程序运行的时间,所以做了个计时器 在网上找了很多发现都是24小时制的,超过24小时后就会回0 然后自己根据24小时制修改了一个不停累加时间的 若是想超过24小时后以 ...

  7. C# 动态方法和静态方法的区别

    C# 动态方法和静态方法的区别 (转) 动态方法与静态方法的区别: 1,使用方法上的区别:动态方法,在使用时需要先创建实例,才能调用实例方法,而静态方法则不需要,直接使用即可. 示例代码如下:静态方法 ...

  8. Python实现Excel转换工具小结

    经历过的打表工具从c++.C#,再到Python,算下来还是Python方便些.一天即可上手开发,非常适合快速迭代中的各种小工具开发. Python开源的第三方库很多,涉及excel方面的也有好几个x ...

  9. Nginx禁止目录执行php文件权限

    location ~ /dir/.*.(php|php5)?$ { deny all; } 禁止dir目录执行php文件权限 .csharpcode, .csharpcode pre { font-s ...

  10. Weblogic读不到Word文件

    之前遇到一导出word文件的需求,我的做法是把对应导出内容放到一个word文件中,把其中变化的内容作为变量,然后把该word文件放在WEB-INF目录下用来作为模板.在导出时通过ServletCont ...