我对实现类型安全的活动流(标准定义为here)感兴趣,我的后端是Azure CosmosDB。问题陈述如下。
我正在使用通用的CosmosDB存储库来存储我的所有活动。我使用一个集合来存储所有实体,因此我创建了一个CosmosDBRepository
,它将域对象转换为数据对象,并在此过程中添加了一个与类名匹配的Type
字段。这样,我可以使用单个集合来引用许多不同类型的文档。我使用Automapper
将数据对象映射到域对象,并确保数据对象永远不会离开存储库层。因此,使用我的存储库的每个服务都使用域对象而不是数据对象。这对所有普通班都非常有用。现在,我需要实现Activity Stream规范中的Activity
类,并且需要生成json,该json解释了不同的参与者,对象,目标和动词,如标准规范的链接所示。
在我决定将Activity
实现为通用类的过程中出现了问题。这是我的实现方式
public class Activity<A, O, T, V>: AggregateRoot
where A : AggregateRoot
where O : AggregateRoot
where T : AggregateRoot
where V : ValueObject<V>
{
// todo: This will allow the user to create derived classes with the
// wrong verbs. Figure out how to not allow that yet support a builder pattern
public Activity(V v) : base() => Action = v;
public A Actor { get; set; }
public O Object { get; set; }
public T Target { get; set; }
public V Action { get; protected set; }
public string ActivityType { get => this.GetType().Name; private set { } } // This is the type name of the concrete activity e.g. "UserLikesItemInRoom"
// This is where reaction activities store their additional content
public AdditionalContent Content { get; set; }
}
我的域对象看起来像这样
public class UserLikesItemInRoom: Activity<User, Item, Room, Like>
{
public UserLikesItemInRoom(User user, Item item, Room, room)
: base(user, item, room, "like") //
{
}
}
有许多这样的类。 UserShareItemToFacebookFeed等,等等,等等。每个人都有不同类型的Actor
,Object
和Verb
。我在每个这些类与一个ActivityDO
类之间定义了几个映射器,该类是所有序列化到的数据对象。
当我检索活动时,它是许多没有共同接口的不同类的集合。所以,我有这些设计问题。
Activity
实现为注定要失败的决定吗?IActor
,IObject
和ITarget
标记界面吗?UserLikesItemInRoom
,UserPinsItemInRoom
等)的存储库来序列化Cosmos DB的内容?