2013-04-16 4 views
3

В Autofac я могу сделать следующееПреобразование Autofac в простой Injector

builder 
.RegisterType<Services.GreetService>() 
    .As<ServiceBase>() 
.InstancePerLifetimeScope(); 

Где GreetService наследует от ServiceBase

Я хотел бы сделать то же рода вещи с простыми Injector.

Кто-нибудь знает как?

Благодаря

Update 1

Я нашел эту статью, в которой они используют autofac в службе Windows: http://www.turbulentintellect.com/2011/02/anatomy-of-windows-service-part-2.html

Я пытался заменить Autofac с простым Injector, но я не могу получить полученную услугу для установки. Ошибка, которую я получаю, это System.ArgumentException: Необходимо указать значение для источника. Это обычно указывает на имя ServiceName, не соответствующее в ServiceInstaller и службе.

Все устанавливается согласно статье, за исключением ниже:

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); 
    } 
} 

Я определенно не хватает что-то здесь, но не могу показаться, чтобы выяснить, что.

Update 2

Когда я использую InstallUtil установить службу я получаю ниже в журнал установки

Запуск транзакционной установки.

Начало этапа установки. См. Содержимое файла для файла журнала C: \ Local Разработка \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.exe сборки . Файл находится в каталоге C: \ Local Разработка \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.InstallLog.

Исключение произошло на этапе установки. System.ArgumentException: Необходимо указать значение для источника.

Начало этапа отката установки. См. Содержание файла журнала для процесса C: \ Local Development \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.exe в сборе . Файл находится в каталоге C: \ Local Разработка \ HelloSvc \ HelloSvc \ bin \ Debug \ HelloSvc.InstallLog.

Этап отката успешно завершен.

Выполненная транзакция завершена.

Как уже упоминалось ранее, это обычно происходит с неправильным присвоением ServiceName, но я не вижу, как это возможно в этом сценарии.

Благодаря

+1

Вы пробовали что-нибудь? Какие у вас проблемы с конверсией? Вы пробовали 'container.Register ()'? Или если вы хотите [fancy lifetimescoping] (http://simpleinjector.codeplex.com/wikipage?title=ObjectLifestyleManagement#PerLifetimeScope) 'container.Register (новый LifetimeScopeLifestyle()),' – nemesv

+0

О вашем обновлении: вы должны быть более конкретными, чем «желание достичь того же, что и в этой статье». Я попытался прочитать эту статью, но до сих пор неясно, каковы ваши проблемы. Если вы не можете понять, почему выбрано исключение, укажите сведения об исключении. – Steven

+0

Также обратите внимание, что Simple Injector делает четкое различие между обычными регистрациями и регистрацией коллекций. Для регистрации/разрешения коллекций вам необходимо использовать 'RegisterAll '/'GetAllInstances ' или 'RegisterAll '/'GetInstance >'. – Steven

ответ

2

Вы не описали, какие проблемы у вас с конверсией, поэтому я стараюсь ответить на два возможных вопроса/проблемы:

Регистрация классов для своих базовых классов также поддерживает Simple Injector с 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 как ServiceProcessInstaller и GreetServiceInstaller как ServiceInstaller, потому что позже вы попытаетесь их решить, так как 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 из-за RegisterLifetimeScope вам нужно создать LifetimeScope с `BeginLifetimeScope:

[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

@ Повсюду посмотрим мой обновленный ответ. – nemesv

+0

Отлично, это разобрало проблему. Не знал, как зарегистрировать две зависимости с базовым классом Installer и решить их. Стивен намекает на это с помощью RegisterAll , но ему придется играть. Огромное спасибо. – Beats