开放仿制药注册

Open Generics Registration

假设我有以下 类:

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 个 类 注册到实现我需要的?
注意构造函数是内部的
这是我没有成功的做法:

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

我得到:"An exception of type 'System.NullReferenceException' occurred in DryIoc.dll but was not handled in user code"当我做的例子
var a = container.Resolve<Process<EventArgs>>();

问题在于从泛型类型获取构造函数。现在你可以使用 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

中修复