Пример EventCloud для aspnetboilerplate - шаблон проектирования - PullRequest
0 голосов
/ 08 июня 2018

в этом уроке о примере приложения EventCloud: https://aspnetboilerplate.com/Pages/Documents/Articles/Developing-MultiTenant-SaaS-ASP.NET-CORE-Angular/index.html

текст гласит: создание нового объекта должно быть выполнено с использованием статического метода «Create» в классе «Event» (без использования"new Entity (....)")

1) поэтому мой первый вопрос: какой это шаблон проектирования?Фабрика?Builder?Другой?

[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) второй вопрос:

, чем написано в статье ...

Менеджер событий .... Все операции с событиями должны выполняться с использованием этогоclass ... (EventManager)

хорошо, метод CreateAsync вызывает метод вставки в репозиторий, вызывается ли статический метод "Event.Create" из метода вставки в репозиторий?если да, не могли бы вы указать мне точку в исходном коде abp?или это внутренний вопрос EntityFramework?

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

1 Ответ

0 голосов
/ 09 июня 2018

Вот мои ответы:

1-) Событие создается статическим фабричным методом.Есть 2 способа создать объект в Domain Driven Design.

  1. Создание со статическими фабричными методами : это удобный способ создания бизнес-объектов.И этот метод используется в EventCloud.Единственным недостатком этого метода является статичность!Если ваша сущность находится в состоянии ожидания, это плохо для тестирования.Но есть 3 преимущества этого подхода;
    1. У них есть имена : например, Event.CreatePublicEvent(), Create.PrivateEvent()
    2. Они могут кэшироваться : Вы можете кэшировать их в приватной статике HashSet или Dictionary.
    3. Они могут иметь подтип .
  2. Создание с помощью конструктора : Еслиу вас есть только один конструктор, тогда создание объекта с помощью его открытого конструктора является наиболее удобным подходом в Domain Driven Design.Пока вы делаете конструктор без параметров защищенным или закрытым.Кроме того, организация должна нести ответственность за свою целостность и достоверность данных, поэтому вам нужно установить все общедоступные свойства, связанные с бизнесом, как частные установщики, а также разрешить их изменение с помощью общедоступных методов.

    Дополнительная информация приведена в https://www.yegor256.com/2017/11/14/static-factory-methods.html


2-) EventManager - это служба домена, используемая для бизнес-логики.И Event.Create() используется в классе EventAppService. Нажмите здесь, чтобы увидеть, где именно выполняется. Даже Event.Create() метод состоит из одной строки кода, но он открыт для расширения.

Надеюсь, это будет полезно;)

Удачного кодирования ...

...