我一直在尝试实现一个类似于Ayende在他的MSDN文章Building a Desktop To-Do Application with NHibernate中发布的解决方案。幸运的是,Skooletz写了一篇类似的文章,在他关于NHibernate拦截器魔术(1,2,3)的3部分博客文章中,跟进了我试图实现的目标。在实例化POCO对象时,我无法让NHibernate调用POCO对象的参数化构造函数。
当我删除受保护的无参数构造函数时,NHibernate报告InvalidProxyTypeException:“以下类型可能不能用作代理: YourNamespace.YourClass:类型应具有可见的(公共的或受保护的)无参数构造函数”。如果我随后添加了受保护的默认构造函数,NHibernate将不再报错,但不会调用依赖项(在重载的构造函数中),从而导致应用程序在运行时未满足依赖项时使用NullReferenceException。
public MyClass
{
IRequiredDependency dependency;
public MyClass(IRequiredDependency dependency)
{
this.dependency = dependency;
}
protected MyClass() {}
}我似乎不能让NHibernate调用重载的构造函数。有什么想法吗?
发布于 2011-02-16 01:12:37
在IoC容器的配置中,除了依赖项本身之外,还必须使用依赖项来声明您的类型。
container.RegisterType<IRequiredDependency, RequiredDependency>();
container.RegisterType<MyClass, MyClass>();我错过了来自Pablo's post的小花边新闻(除了它的依赖项IInvoiceTotalCalculator之外,他还注册了Invoice类),因为我使用的是Unity而不是Windsor。
另一个注意事项:我发现的是,如果您想要有任何其他重载构造函数,请将它们设为内部构造函数,将默认构造函数保留为受保护的,并且只有一个包含依赖项的公共构造函数。这个花边新闻帮助我加强了一些类的API设计。
https://stackoverflow.com/questions/5005120
复制相似问题