c# - C# 中的通用消息传递模式

标签 c# generics interface

我不确定我是否可以这样做,但我正在构建需要将一种类型的实体添加到另一种类型的应用程序的服务层。一个例子可能是将文章添加到类别中。它通过一个服务类来做到这一点,例如:

public class ArticleService {
     public IResponse AddArticleToCategory(IAddRelatedItemRequest<Category, Article> request) {
     // do stuff with the request
     }
}

我希望 IAddRelatedItemRequest 接口(interface)是通用的,以便它可以用于任何添加请求,类似于:

public interface IAddRelatedItemRequest<T, U>
where T : class
where U : class {
    Object Key { get;set; }
    List<Object> RelatedKey { get;set; }
}

发生的事情是请求需要项目的主键(例如类别)和相关项目(例如文章)的主键列表。具体的 ArticleService 中的 AddCommentToArticle 类然后通过其键检索项目,然后将相关的键项目添加到它。

(注意,我不希望发生的是提供实际实体和相关实体列表——这需要通过原始主键来完成)

我想以某种方式对请求进行强类型化,因此我可以提供(例如)一个 Guid 和一个整数列表,而不是提供一个对象和一个对象列表。

我并不是特别想通过泛型提供这两种类型,因为它会降低代码的可读性,而且对象的键可能会改变类型。

理想情况下,我想以某种方式提取实体 ID 的类型并将其包含在界面中。这可能吗?

最佳答案

我不太确定我是否完全按照你的例子,但听起来你想要的是这样的:

interface IKeyResolver<T, TKey>
{
  TKey GetKey(T item);
}

public interface IAddRelatedItemRequest<TParentKey, TChildKey>
{
  TParentKey Key { get;set; }
  List<TChildKey> RelatedKey { get;set; }
}

// assume categories have an int key
class CategoryKeyResolver : IKeyResolver<int>
{
  int GetKey(Category c) { return c.CategoryId; }
}

// assume articles use a GUID
class ArticleKeyResolver : IKeyResolver<Guid>
{
  Guid GetKey(Article a) { return a.ArticleId;
}

然后您将在您的服务方法中使用适当的 key 解析器。 key 解析器可以是您服务中的属性,或者只是根据需要实例化适当的 key 解析器。当您的底层持久性机制本身是通用的(例如通用存储库实现)时,诸如 key 解析器之类的东西非常有用。

关于c# - C# 中的通用消息传递模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7347826/

相关文章:

c# - 由特定通用包含接口(interface)参数化的通用容器接口(interface)

c# - 如何实现基于 Web 的安装程序?

c# - 如何在 OxyPlot 中强制 x 轴保持在 0?

java - 我正在尝试创建一个可以接受整数和数组的 arrayList

c# - 如何将 DataSet/DataTable 转换为某种类型的通用列表?

java - 具有 UnsupportedOperationException 实现的默认方法

java - 在java中没有这样的关键字的静态接口(interface)和普通接口(interface)有什么区别?

c# - .net 日历 requiredFieldValidator

c# - 在 C# 中包装一个不可继承的类

c - _Generic assoc-list 中的函数指针类型是否没有按预期工作?