SimpleInjector在更新后无法注入字符串

时间:2015-08-22 11:17:55

标签: c# dependency-injection simple-injector

将SimpleInjector从版本2.8.3更新到v3.0.1后,当我尝试将连接字符串传递给构造函数时,它会返回错误。这在过去工作正常,但在更新后出现问题。错误:

  

类型' System.ArgumentException'的第一次机会异常。发生了   在SimpleInjector.dll中

     

附加信息:MwmJobUpdateNotifier类型的构造函数   包含参数' connectionString'类型为String的类型不能   用于构造函数注入。

这是SimpleInjector容器的配置位置:

    public static Container Configure(Container container)
    {
        // Force assembly reference so Interfaces load correctly.
        if (typeof(IJobRepository) != null) 
            container.RegisterAllInterfacesForClassesInAssemblyContaining<JobRepository>();

        // Force assembly reference so Interfaces load correctly.
        if (typeof(IGmcService) != null)
            container.RegisterAllInterfacesForClassesInAssemblyContaining<GmcService>();

        container.Options.AllowOverridingRegistrations = true;
        container.Register<IMwmJobUpdateNotifier>(() => new MwmJobUpdateNotifier(container.GetInstance<IJobRepository>(),
            ConfigurationManager.ConnectionStrings["Coordinate_DatabaseEntities"].ConnectionString));
        container.Options.AllowOverridingRegistrations = false;

        MWM.Service.DAL.Config.AGI.AGIIocConfig.Configure(container);

        return container;
    }

看起来我不喜欢将两个参数传递给构造函数的方式。

已编辑:异常在我的ContainerException类中触发,其中所有接口都已注册:

public static Container RegisterAllInterfacesForClassesInAssemblyContaining<T>(this Container container, Lifestyle lifestyle = null) where T : class
    {
        var assembly = typeof(T).Assembly;

        var registrations = assembly.GetExportedTypes()
            .Where(type => type.IsClass && 
                type.GetInterfaces()
                    .Except(type.GetInterfaces().SelectMany(x => x.GetInterfaces()))
                    .Except(type.BaseType.GetInterfaces())
                    .Any())
            .Select(type => new 
            { 
                Services = type.GetInterfaces()
                    .Except(type.GetInterfaces().SelectMany(x => x.GetInterfaces()))
                    .Except(type.BaseType.GetInterfaces()), 
                Implementation = type
            });

        foreach (var registration in registrations)
        {
            foreach (var service in registration.Services)
            {
                if (registration.Implementation.IsGenericTypeDefinition)
                {
                    if (lifestyle == null)
                    {
                        container.Register(service.GetGenericTypeDefinition(), registration.Implementation.GetGenericTypeDefinition());
                    }
                    else
                    {
                        container.Register(service.GetGenericTypeDefinition(), registration.Implementation.GetGenericTypeDefinition(), lifestyle);
                    }
                }
                else
                {
                    if (lifestyle == null)
                        container.Register(service, registration.Implementation);
                    else
                        container.Register(service, registration.Implementation, lifestyle);
                }
            }
        }

        return container;
    }

在倒数第二个container.Register(...)电话中捕获了异常。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但是从我在这里阅读的内容:How do I pass a parameter to the constructor using Simple Injector?

似乎您/我们必须更改设计,以便运行时值不是构造函数的依赖项。

在我的特定情况下,该对象是一个数据库服务,需要连接字符串参数,这些参数存储在配置文件中,由于发布管道中的环境不同,因此使它们成为运行时值。

我的存储库项目无法直接访问配置文件(因为我认为它可以,但我觉得我尝试不对)所以我引入了一个临时值依赖解析器。这个对象只是一个字典的包装器,它有一些管理方法可以添加,删除,更新,合并和检查所需的值,因此每个依赖它的对象都可以检查它是否提供了所需的项目。

container.RegisterSingleton<IResolver, Resolver>(new Resolver());

然后容器只注册解析器:

public class SomeClass : ISomeClass
{
    private readonly IResolver resolver;
    public SomeClass(IResolver resolver)
    {
        this.resolver = resolver;
    }

    public void SomeMethod(string whatever)
    {
        if (!resolver.ResolvesAll("fred", "barny", "wilma"))
           throw new Exception("missing dependencies");

        var fred = resolver.Resolve<string>("fred");
        SomeOtherMethod(fred, whatever);
    }
}

依赖类接收自动连线对象。

{{1}}