【问题标题】:In a repository pattern, how can I integrate domain object factories在存储库模式中,如何集成域对象工厂
【发布时间】:2015-06-04 01:44:42
【问题描述】:

我有一个这样的项目:

网站 --> 服务 --> 存储库 --> 域对象

我使用 Entity Framework 6 和 Autofac。

有人告诉我应该从我的域对象中删除所有构造逻辑,以便它们尽可能保持 POCO。问题是,我有在创建新对象时应该初始化的属性,例如 CreationDate 和 UserIdCreatedBy

例如,如果我有一个 Client 对象,我会在 Client 类构造函数中使用以下逻辑:

public class Client
{
    public Client()
    {
        this.CreationDate = DateTime.UtcNow;
        if (Thread.CurrentPrincipal is CustomPrincipal
            && ((CustomPrincipal)Thread.CurrentPrincipal).CustomIdentity != null
            && ((CustomPrincipal)Thread.CurrentPrincipal).CustomIdentity.User != null)
        {
            this.UserIdCreatedBy = ((CustomPrincipal)Thread.CurrentPrincipal).CustomIdentity.User.UserId;
        }
    }

    ... Properties and such
}

所以现在,我想将此构造函数逻辑从域对象中取出到该对象的工厂中。我怎样才能优雅地做到这一点,以便实体框架在我调用 MyContext.Clients.Create() 时使用它?这甚至可能吗?我知道调用 Thread 的 CurrentPrincipal 也不是那么好,但它是为了显示逻辑可能比普通默认值更复杂的示例。

非常感谢

【问题讨论】:

  • 所以他们希望你创建一个贫血模型。只是一袋没有行为的数据?
  • @PhilipStuyck 这就是 POCO(普通旧 CLR 对象)的最简单形式。 ;)
  • 那是一种反模式。
  • 我愿意接受建议。你会怎么做?
  • 问题是您为什么要删除该构造函数逻辑。你被告知删除它,由谁?如果那是您的老板并且您无法改变他的想法,那么无论我说什么,您都必须这样做;-)我实际上是在尝试与您在这里所做的相反。我正在尝试将行为放在我的域对象中。

标签: c# asp.net-mvc-5 entity-framework-6 repository-pattern poco


【解决方案1】:

假设您使用数据库存储来存储项目(而不是用于操作它们),我认为您可以使用单独的类来实例化对象。 (你描述的某种工厂。)

例如,在我的应用程序中,我经常使用 UserManager 类。此类根据登录方法(电子邮件+密码、社交 ID 等)完成与用户创建相关的所有工作。该类也可能包含更改密码等方法。

更新:

我使用数据层作为知道如何从/向数据库创建/更新/读取/删除对象的东西。此外,与 db 一起使用的类可以具有 selectByThis、selectByThat 等方法。因此,除了 db 层之外,您无需在代码中的某处编写特定于 db 的内容。 (我的意思是你永远不需要写像.Where(a => a.SomeProp == true)这样的东西,你只需要为此使用特殊的方法,所以如果你改变数据库你只需要改变你的数据库层,现在整个项目。)

所以是的,当我需要一些特殊的逻辑来初始化对象时,我会使用单独的类。 (就像某种管理器一样。)该类完成所有工作,然后只是告诉 db 层:“嘿,我完成了所有工作,所以只需为我保存这个对象!”

它为您简化了维护。此外,这也是遵循单一职责规则的方法。一个类初始化,做一些工作,另一个类保存。

【讨论】:

  • 我确实在使用数据库存储,更准确地说是实体框架。如果我明白你在说什么,我应该在我的存储库中编写我的创建逻辑,对吗?因为我的存储库是服务从头开始(新)或从数据库获取对象的地方。或者我应该在服务和存储库之间创建一个新层?我希望尽可能干净和高效,以最大限度地提高可维护性并遵守 Robert C. Martin 的“清洁代码”原则。非常感谢您的帮助。
  • 非常感谢。现在,有了那个经理,你如何使用它以及它在项目中的什么位置?您是否在域和数据项目之间(或与域并行)有一个“对象管理器”项目?是否只有数据层知道这些管理器类的存在,而所有其他层即使在创建新对象时也会向数据层询问对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多