2013-04-16 70 views
3

在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設置不正確,但我不明白在這種情況下如何實現。

感謝

+1

你嘗試過什麼?轉換有什麼問題?你嘗試過'container.Register ()'?或者,如果你想要[fancy lifetimescoping](http://simpleinjector.codeplex.com/wikipage?title=ObjectLifestyleManagement#PerLifetimeScope)'container.Register (new LifetimeScopeLifestyle());' – nemesv

+0

關於您的更新:你必須比「想要達到同樣的文章」更具體。我試圖閱讀那篇文章,但目前還不清楚你的問題是什麼。如果您無法弄清楚爲什麼拋出異常,請包含異常詳細信息。 – Steven

+0

另請注意,簡單注射器在正常註冊和收藏註冊之間進行了明確區分。要註冊/解析集合,您需要使用'RegisterAll '/'GetAllInstances '或'RegisterAll '/'GetInstance >'。 – Steven

回答

2

您還沒有描述你有什麼問題與轉換,所以我儘量回答兩個問題可能/問題:

註冊爲他們的基類的類也用簡單的噴油器支持該Register方法:

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作爲ServiceProcessInstallerGreetServiceInstaller作爲ServiceInstaller因爲稍後您嘗試將它們解析爲ServiceProcessInstallerServiceInstaller

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因爲RegisterLifetimeScope你需要創建一個`BeginLifetimeScope一個LifetimeScope:

[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在所有的安裝程序,所以你可以寫:

internal class InstallBootstrapper 
{ 
    public Container Build() 
    { 
     var container = new Container(); 

     container.Register<ServiceProcessInstaller, 
             HelloServiceProcessInstaller>(); 
     container.Register<ServiceInstaller, 
             GreetServiceInstaller>(); 
     container.Register<IServiceNameProvider, 
             ServiceNameProvider>(); 

     container.Verify(); 

     return container; 
    } 
} 

[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>(); 
     Installers.Add(processInstallers); 
     Installers.Add(serviceInstaller);   
    } 
} 
+0

謝謝你不知道我是如何錯過了。我更新了我的問題。如果你有機會,你介意看看 – Beats

+0

@Beats看到我更新的答案。 – nemesv

+0

非常好,已經對問題進行了排序。不知道如何向Installer基類註冊兩個依賴項並解決它們。史蒂文通過RegisterAll 暗示了這一點,但必須有一個發揮。謝謝一堆。 – Beats