我正在努力了解我的工厂类应该在我的DDD项目中做什么.是的,工厂应该用于创建对象,但究竟应该做什么.考虑以下工厂类:
public class ProductFactory { private static IProductRepository _repository; public static Product CreateProduct() { return new Product(); } public static Product CreateProduct() { //What else would go here? } public static Product GetProductById(int productId) { //Should i be making a direct call to the respoitory from here? Greener.Domain.Product.Product p = _repository.GetProductById(productId); return p; } }
我应该从工厂内直接调用存储库吗?
从数据库中检索数据时,如何管理对象创建?
我需要做什么才能完成这个课程,我还应该使用其他什么方法?
我是否应该使用此类从域和存储库中创建Product对象?
请帮忙!
我应该从工厂内直接调用存储库吗?
不,在检索物品时不要使用工厂,只有在第一次创建工厂时才使用工厂.
从数据库中检索数据时,如何管理对象创建?
如果对象的初始创建需要,则将该数据传递到工厂.
我需要做什么才能完成这个课程,我还应该使用其他什么方法?
许多工厂甚至不是单独的类,它们只是提供对象创建的方法.如果您觉得它只是调用无参数构造函数,您可以将工厂方法折叠到另一个类中.
我是否应该使用此类从域和存储库中创建Product对象?
存储库用于获取(在某种意义上创建)现有对象,工厂是第一次创建对象.
最初,除了调用构造函数之外,许多工厂不会做太多工作.但是一旦开始重构和/或创建更大的对象层次结构,工厂就变得更加相关.
说明和示例:
例如,在我正在开发的项目中,我有一个excel处理器基类和许多实现该基类的子类.我使用工厂获取正确的一个,然后调用它上面的方法,不知道返回了哪个子类.(注意:我更改了一些变量名并去掉/改变了很多代码)
处理器基类:
public abstract class ExcelProcessor { public abstract Result Process(string ExcelFile); }
处理器子类之一:
public class CompanyAExcelProcessor : ExcelProcessor { public override Result Process(string ExcelFile) { //cool stuff } }
厂:
public static ExcelProcessor CreateExcelProcessor(int CompanyId, int CurrentUserId) { CompanyEnum company = GetCompanyEnum(CompanyId); switch (company) { case CompanyEnum.CompanyA: return new CompanyAExcelProcessor(); case CompanyEnum.CompanyB: return new CompanyBExcelProcessor(); case CompanyEnum.CompanyC: return new CompanyCExcelProcessor(CurrentUserId); //etc... } }
用法:
ExcelProcessor processor = CreateExcelProcessor(12, 34); processor.Process();
请注意,实例化新对象有两个原因:创建它并从数据库中重新水化它.
第一种情况由工厂处理.您可以提供多种方法在工厂中创建对象.工厂方法应返回有效对象,因此您可以将参数传递给这些方法以提供所需信息.
工厂方法还可以根据参数选择实际类型进行实例化.
你不应该将它与数据库中的再水化混合在一起.这种实例化应该从数据行中获取值并用它实例化对象.我通常称之为数据构建器而不是工厂.
主要区别在于工厂将使用新标识实例化对象,而数据库将实例化具有已存在标识的对象.