假设我有以下类:
public class Setup { }
public class Configuration<T> where T : class
{
internal Configuration(Setup setup) { }
}
public class Process<T> where T : class
{
internal Process(Configuration<T> configuration) { }
}
我想在DryIoc中注册这些类,并且需要每个Process<T>
都是单例(就像Configuration<T>
)。因此,Process<ClassA>
会解析同一个实例,而Process<ClassB>
也会这样做。但是Process<ClassA>
和Process<ClassB>
将是2个不同的实例。
这同样适用于Configuration<T>
。
如何注册这3个类来实现我的需要?< br> 请注意,构造函数是内部的
这是我没有成功的事情:
var container = new Container();
container.Register<Setup>(Reuse.Singleton);
container.Register(typeof (Configuration<>),
made: Made.Of(typeof (Configuration<>).GetConstructorOrNull(true, typeof (Setup))));
container.Register(typeof(Process<>), Reuse.Singleton,
Made.Of(typeof(Process<>).GetConstructorOrNull(true, typeof(Configuration<>))));
我得到:&#34;类型&#39; System.NullReferenceException&#39;发生在DryIoc.dll中但未在用户代码中处理&#34;例如,当我做var a = container.Resolve<Process<EventArgs>>();
答案 0 :(得分:1)
问题在于从泛型类型获取构造函数。目前,您可以使用DryIoc API获取ConstructorWithResolvableArgumentsIncludingNonPublic
:
工作样本看起来like that:
var container = new Container();
container.Register<Setup>(Reuse.Singleton);
container.Register(typeof(Configuration<>), Reuse.Singleton,
made: FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic);
container.Register(typeof(Process<>), Reuse.Singleton,
FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic);
var p = container.Resolve<Process<EventArgs>>();
在将来的版本中,它会更简单,如FactoryMethod.Constructor(includeNonPublic: true)
。
这是DryIoc 2.9.7中的一个实际问题,它使用内部构造函数创建单例。修复工作正在进行中。现在,您可以通过使用规则禁用某些单例优化来使用解决方法:
var container = new Container(rules => rules.WithoutEagerCachingSingletonForFasterAccess());
更新了live sample。
问题已在DryIoc 2.10
中修复