【发布时间】:2014-03-21 14:56:22
【问题描述】:
我不想“允许”在代码中直接创建对象,例如:
var p = new Product();
原因是我希望它由 IOC 控制,因此我可以轻松更改其实现或扩展它。因此,代码看起来像:
var p = iocContainer.Get<Product>();
问题是人们可能“忘记”致电 IOC,而转而使用 new 产品。我的想法是让Product 成为abstract 类。然后,动态创建一个类型说ProductImpl,它扩展自Product,它不是抽象的。在应用程序启动时,会扫描所有数据对象并自动创建这些动态类。这可能吗?理想情况下,这种类型的命名空间总是相同的,比如BusinessLogic.Impl.ProductImpl。
创建的动态类将类似于以下内容:
public class ProductImpl : Product
{
public ProductImpl()
{
}
}
【问题讨论】:
-
为什么不简单地将构造函数设为私有?
-
当我需要它时,我怎样才能真正创建它?另外,我使用 RavenDB(文档数据库)作为我的数据存储,我不认为它可以在从数据存储加载回时使用私有构造函数重新创建对象。不过,我会调查一下。
-
它可以通过使用反射的代码来工作,RavenDB 也支持它! :) 感谢您的快速回答。如果您将此作为答案发布,我可以将其标记为答案。
-
Activator.CreateInstance具有允许使用非公共 ctor 创建对象的重载。我不知道 RavenDB,但如果你能提供一个创建对象的工厂,它也可以在那里工作。
标签: c# dynamic reflection