将Autofac转换为Simple Injector

时间:2013-04-16 14:59:54

标签: c# autofac simple-injector

在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设置不正确,但我不知道在这种情况下这是如何实现的。

由于

1 个答案:

答案 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
相关问题