当前位置:  开发笔记 > 编程语言 > 正文

我的DDD工厂类应该采用哪些方法?

如何解决《我的DDD工厂类应该采用哪些方法?》经验,为你挑选了2个好方法。

我正在努力了解我的工厂类应该在我的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对象?

请帮忙!



1> Mark Rogers..:

我应该从工厂内直接调用存储库吗?

不,在检索物品时不要使用工厂,只有在第一次创建工厂时才使用工厂.

从数据库中检索数据时,如何管理对象创建?

如果对象的初始创建需要,则将该数据传递到工厂.

我需要做什么才能完成这个课程,我还应该使用其他什么方法?

许多工厂甚至不是单独的类,它们只是提供对象创建的方法.如果您觉得它只是调用无参数构造函数,您可以将工厂方法折叠到另一个类中.

我是否应该使用此类从域和存储库中创建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();



2> thinkbeforec..:

请注意,实例化新对象有两个原因:创建它并从数据库中重新水化它.

第一种情况由工厂处理.您可以提供多种方法在工厂中创建对象.工厂方法应返回有效对象,因此您可以将参数传递给这些方法以提供所需信息.

工厂方法还可以根据参数选择实际类型进行实例化.

你不应该将它与数据库中的再水化混合在一起.这种实例化应该从数据行中获取值并用它实例化对象.我通常称之为数据构建器而不是工厂.

主要区别在于工厂将使用新标识实例化对象,而数据库将实例化具有已存在标识的对象.


工厂通常位于域中,而数据构建器位于持久性基础架构中.
推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有