在C#中实现类型安全的活动流

时间:2018-10-17 08:38:40

标签: generics repository-pattern activity-streams

我对实现类型安全的活动流(标准定义为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等,等等,等等。每个人都有不同类型的ActorObjectVerb。我在每个这些类与一个ActivityDO类之间定义了几个映射器,该类是所有序列化到的数据对象。

当我检索活动时,它是许多没有共同接口的不同类的集合。所以,我有这些设计问题。

  1. 决定将Activity实现为注定要失败的决定吗?
  2. 在这种设置中,获取活动列表的最佳方法是什么,其中返回的集合具有派生自同一泛型的不同类?我应该为所有活动实现标记界面吗?
  3. 最好不要使用模板,而是使用IActorIObjectITarget标记界面吗?
  4. 如何使用单个存储库而不是每种泛型派生类型(例如UserLikesItemInRoomUserPinsItemInRoom等)的存储库来序列化Cosmos DB的内容?

0 个答案:

没有答案