entity-framework - 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);
}
解决方案
以下是我的回答:
1-) 使用静态工厂方法创建事件。有 2 种方法可以在Domain Driven Design
.
- 使用静态工厂方法创建:这是创建业务实体的便捷方式。EventCloud 中正在使用这种方法。这种方法的唯一缺点是它是静态的!如果您的实体持有状态,则不利于可测试性。但是这种方法有 3 个优点;
- 他们有名字:例如
Event.CreatePublicEvent()
,Create.PrivateEvent()
- 它们可以缓存:您可以将它们缓存在私有静态
HashSet
或Dictionary
. - 他们可以子类型。
- 他们有名字:例如
用构造函数创建:如果你只有一个构造函数,那么通过它的公共构造函数创建一个对象是最方便的方法
Domain Driven Design
。只要您使无参数构造函数受保护或私有。此外,一个实体应该对自己的数据完整性和有效性负责,因此您必须将所有与业务相关的公共属性设置为私有设置器,并且您应该允许它们通过公共方法进行更改。更多信息,请参见https://www.yegor256.com/2017/11/14/static-factory-methods.html
2-) EventManager是用于业务逻辑的域服务。并 Event.Create()
在EventAppService
课堂上使用。单击此处查看具体执行的位置。EvenEvent.Create()
方法由一行代码组成,但它可以扩展。
我希望这会有用;)
快乐的编码...
推荐阅读
- javascript - JavaScript 通过键将对象数组转换为对象
- javascript - Jasmine + TypeScript,找不到Spy类的withArgs()方法
- javascript - 领域数据库链接对象
- python - GridSearchCV,数据框每个部分中每个类的表示
- eclipse - 无法运行 UIMA Ruta 程序(导入不起作用?)
- scala - SnappyData 上的 Theta Sketch (Yahoo)
- odata - o在 component.js 中声明的数据模型 - 我的数据在哪里?
- python - 返回的 Python 字典
- laravel - 过滤子查询
- angular - Angular 5中水平时间线的实现