在Autofac中我可以执行以下操作
builder
.RegisterType<Services.GreetService>()
.As<ServiceBase>()
.InstancePerLifetimeScope();
GreetService从ServiceBase继承的地方
我想用Simple Injector做同样的事情。
有人知道吗?
由于
更新1
我发现这篇文章在windows服务中使用autofac:http://www.turbulentintellect.com/2011/02/anatomy-of-windows-service-part-2.html
我一直在尝试用Simple Injector替换Autofac,但我无法获得安装的结果服务。我收到的错误是System.ArgumentException:必须指定source的值。这通常指向ServiceInstaller和Service中的ServiceName不匹配。
根据文章设置的所有内容除了以下内容:
internal class ServiceBootstrapper
{
//public IContainer Build()
//{
// var builder = new ContainerBuilder();
// builder
// .RegisterType<GreetService>()
// .As<ServiceBase>()
// .InstancePerLifetimeScope();
// builder
// .RegisterType<ServiceNameProvider>()
// .As<IServiceNameProvider>()
// .InstancePerLifetimeScope();
// builder
// .RegisterType<Greeter>()
// .As<IGreeter>()
// .InstancePerLifetimeScope();
// return builder.Build();
//}
public Container Build()
{
var container = new Container();
container.RegisterLifetimeScope<ServiceBase, GreetService>();
container.RegisterLifetimeScope<IServiceNameProvider, ServiceNameProvider>();
container.RegisterLifetimeScope<IGreeter, Greeter>();
container.Verify();
return container;
}
}
internal class InstallBootstrapper
{
//public IContainer Build()
//{
// var builder = new ContainerBuilder();
// builder
// .RegisterType<HelloServiceProcessInstaller>()
// .As<Installer>()
// .InstancePerLifetimeScope();
// builder
// .RegisterType<GreetServiceInstaller>()
// .As<Installer>()
// .InstancePerLifetimeScope();
// builder
// .RegisterType<Config.ServiceNameProvider>()
// .As<Config.IServiceNameProvider>()
// .InstancePerLifetimeScope();
// return builder.Build();
//}
public Container Build()
{
var container = new Container();
container.RegisterLifetimeScope<HelloServiceProcessInstaller>();
container.RegisterLifetimeScope<GreetServiceInstaller>();
container.RegisterLifetimeScope<IServiceNameProvider, ServiceNameProvider>();
container.Verify();
return container;
}
}
public static class Program
{
public static void Main(String[] args)
{
var iocBootstrap = new ServiceBootstrapper();
var container = iocBootstrap.Build();
var services = container.GetInstance<ServiceBase>();
ServiceBase.Run(services);
//var services = container.Resolve<IEnumerable<ServiceBase>>();
//ServiceBase.Run(services.ToArray());
}
}
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
public ProjectInstaller()
{
var bootstrapper = new InstallBootstrapper();
var container = bootstrapper.Build();
var processInstallers = container.GetInstance<ServiceProcessInstaller>();
var serviceInstaller = container.GetInstance<ServiceInstaller>();
//var installers = container.GetInstance<IEnumerable<Installer>>();
//var installers = container.Resolve<IEnumerable<Installer>>();
//Installers.AddRange(installers.ToArray());
Installers.Add(processInstallers);
Installers.Add(serviceInstaller);
}
}
我肯定在这里遗漏了一些东西,但似乎无法解决问题。
更新2
当我使用InstallUtil安装服务时,我在安装日志中收到以下内容
运行事务安装。
开始安装的安装阶段。看到的内容 C:\ Local的日志文件 开发\ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.exe程序集 进展。该文件位于C:\ Local 发展\ HelloSvc \ HelloSvc \ BIN \调试\ HelloSvc.InstallLog。
安装阶段发生异常。 System.ArgumentException:必须指定source的值。
安装的回滚阶段正在开始。看到内容 C:\ Local的日志文件 开发\ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.exe程序集 进展。该文件位于C:\ Local 发展\ HelloSvc \ HelloSvc \ BIN \调试\ HelloSvc.InstallLog。
回滚阶段已成功完成。
已完成交易安装。
如前所述,这通常会对ServiceName设置不正确,但我不知道在这种情况下这是如何实现的。
由于
答案 0 :(得分:2)
您还没有描述转换中存在哪些问题,因此我尝试回答两个可能的问题/问题:
使用Register
方法为Simple Injector支持其基类的类注册:
var container = new Container();
container.Register<ServiceBase, GreetService>();
如果您对InstancePerLifetimeScope
部分有疑问,那么您可以在Lifetime Scoping Extensions中找到类似的LifetimeScopeLifestyle
,您可以将其用于:
var container = new Container();
container.Register<ServiceBase, GreetService>(
new LifetimeScopeLifestyle());
或者可选地使用同一个包中的RegisterLifetimeScope
扩展名方法:
var container = new Container();
container.RegisterLifetimeScope<ServiceBase, GreetService>();
关于服务安装问题:
在InstallBootstrapper
中,您需要将HelloServiceProcessInstaller
注册为ServiceProcessInstaller
,将GreetServiceInstaller
注册为ServiceInstaller
,因为稍后您会尝试将其解析为{{1} }和ServiceProcessInstaller
:
ServiceInstaller
在internal class InstallBootstrapper
{
public Container Build()
{
var container = new Container();
container.RegisterLifetimeScope<ServiceProcessInstaller,
HelloServiceProcessInstaller>();
container.RegisterLifetimeScope<ServiceInstaller,
GreetServiceInstaller>();
container.RegisterLifetimeScope<IServiceNameProvider,
ServiceNameProvider>();
container.Verify();
return container;
}
}
由于ProjectInstaller
你需要使用`BeginLifetimeScope创建一个LifetimeScope:
RegisterLifetimeScope
为什么你在安装程序中根本不需要[RunInstaller(true)]
public class ProjectInstaller : Installer
{
public ProjectInstaller()
{
var bootstrapper = new InstallBootstrapper();
var container = bootstrapper.Build();
using(container.BeginLifetimeScope())
{
var processInstallers =
container.GetInstance<ServiceProcessInstaller>();
var serviceInstaller =
container.GetInstance<ServiceInstaller>();
Installers.Add(processInstallers);
Installers.Add(serviceInstaller);
}
}
}
,所以你可以写:
LifetimeScope