将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(...)
电话中捕获了异常。
答案 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}}