首页 > 解决方案 > aspnetboilerplate EventCloud 示例 - 设计模式

问题描述

在本教程中关于 EventCloud 示例应用程序: https ://aspnetboilerplate.com/Pages/Documents/Articles/Developing-MultiTenant-SaaS-ASP.NET-CORE-Angular/index.html

文本指出:必须使用“事件”类中的静态方法“创建”来创建新实体(不使用“新实体(....)”)

1)所以我的第一个问题是:这是哪种设计模式?工厂?建设者?其他?

[Table("AppEvents")]
public class Event : FullAuditedEntity<Guid>, IMustHaveTenant
{
 ......
 ....
 ...
 /// <summary>
 /// We don't make constructor public and forcing to create events using <see cref="Create"/> method.
 /// But constructor can not be private since it's used by EntityFramework.
 /// Thats why we did it protected.
 /// </summary>
 protected Event()
 {

 }

 public static Event Create(int tenantId, string title, DateTime date, string description = null, int maxRegistrationCount = 0)
 {
    var @event = new Event
    {
        Id = Guid.NewGuid(),
        TenantId = tenantId,
        Title = title,
        Description = description,
        MaxRegistrationCount = maxRegistrationCount
    };

    @event.SetDate(date);

    @event.Registrations = new Collection<EventRegistration>();

   return @event;
 }

 ....
 ...

2)第二个问题:

比文章说的...

事件管理器......所有事件操作都应该使用这个类来执行......(EventManager)

好的,CreateAsync 方法调用存储库插入方法,是从存储库插入方法内部调用的静态“Event.Create”吗?如果是,您能否指出 abp 源代码中的要点?还是EntityFramework的内部问题?

public class EventManager : IEventManager
{
 ......
 ....
 ..
 public async Task CreateAsync(Event @event)
 {
     await _eventRepository.InsertAsync(@event);
 }

标签: entity-frameworkdesign-patternsaspnetboilerplate

解决方案


以下是我的回答:

1-) 使用静态工厂方法创建事件。有 2 种方法可以在Domain Driven Design.

  1. 使用静态工厂方法创建:这是创建业务实体的便捷方式。EventCloud 中正在使用这种方法。这种方法的唯一缺点是它是静态的!如果您的实体持有状态,则不利于可测试性。但是这种方法有 3 个优点;
    1. 他们有名字:例如Event.CreatePublicEvent()Create.PrivateEvent()
    2. 它们可以缓存:您可以将它们缓存在私有静态HashSetDictionary.
    3. 他们可以子类型
  2. 用构造函数创建:如果你只有一个构造函数,那么通过它的公共构造函数创建一个对象是最方便的方法Domain Driven Design。只要您使无参数构造函数受保护或私有。此外,一个实体应该对自己的数据完整性和有效性负责,因此您必须将所有与业务相关的公共属性设置为私有设置器,并且您应该允许它们通过公共方法进行更改。

    更多信息,请参见https://www.yegor256.com/2017/11/14/static-factory-methods.html


2-) EventManager是用于业务逻辑的域服务。并 Event.Create()EventAppService课堂上使用。单击此处查看具体执行的位置。EvenEvent.Create()方法由一行代码组成,但它可以扩展。

我希望这会有用;)

快乐的编码...


推荐阅读