В 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, но я не вижу, как это возможно в этом сценарии.
Благодаря
Вы пробовали что-нибудь? Какие у вас проблемы с конверсией? Вы пробовали 'container.Register()'? Или если вы хотите [fancy lifetimescoping] (http://simpleinjector.codeplex.com/wikipage?title=ObjectLifestyleManagement#PerLifetimeScope) 'container.Register (новый LifetimeScopeLifestyle()),' –
nemesv
О вашем обновлении: вы должны быть более конкретными, чем «желание достичь того же, что и в этой статье». Я попытался прочитать эту статью, но до сих пор неясно, каковы ваши проблемы. Если вы не можете понять, почему выбрано исключение, укажите сведения об исключении. – Steven
Также обратите внимание, что Simple Injector делает четкое различие между обычными регистрациями и регистрацией коллекций. Для регистрации/разрешения коллекций вам необходимо использовать 'RegisterAll'/'GetAllInstances ' или 'RegisterAll '/'GetInstance >'. –
Steven