开放仿制药注册
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
中修复
假设我有以下 类:
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
中修复