开放仿制药注册

时间:2017-01-13 22:39:13

标签: dryioc

假设我有以下类:

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>>();

1 个答案:

答案 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

中修复