在Autofac我可以做以下轉換Autofac以簡單的注射器
builder
.RegisterType<Services.GreetService>()
.As<ServiceBase>()
.InstancePerLifetimeScope();
凡GreetService從ServiceBase
繼承我願做同樣的事情用簡單的注射器。
有人知道嗎?
感謝
更新1
我發現這篇文章,他們在Windows服務中使用autofac:http://www.turbulentintellect.com/2011/02/anatomy-of-windows-service-part-2.html
我一直在試圖用簡單的噴油器更換Autofac,但我不能得到最終的服務進行安裝。我收到的錯誤是System.ArgumentException:必須爲源指定值。這通常指向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 Development \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.exe程序集的 進度。該文件位於C:\ Local Development \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.InstallLog。
安裝階段發生異常。 System.ArgumentException:必須指定源的值。
安裝的回滾階段開始。請參閱內容 的C:\ Local Development \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.exe程序集的 進度。該文件位於C:\ Local Development \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.InstallLog。
回滾階段已成功完成。
交易安裝已完成。
如前所述,這通常是對ServiceName設置不正確,但我不明白在這種情況下如何實現。
感謝
你嘗試過什麼?轉換有什麼問題?你嘗試過'container.Register()'?或者,如果你想要[fancy lifetimescoping](http://simpleinjector.codeplex.com/wikipage?title=ObjectLifestyleManagement#PerLifetimeScope)'container.Register (new LifetimeScopeLifestyle());' –
nemesv
關於您的更新:你必須比「想要達到同樣的文章」更具體。我試圖閱讀那篇文章,但目前還不清楚你的問題是什麼。如果您無法弄清楚爲什麼拋出異常,請包含異常詳細信息。 – Steven
另請注意,簡單注射器在正常註冊和收藏註冊之間進行了明確區分。要註冊/解析集合,您需要使用'RegisterAll'/'GetAllInstances '或'RegisterAll '/'GetInstance >'。 –
Steven