C#中的通用消息传递模式
发布时间:2020-12-15 21:23:24 所属栏目:百科 来源:网络整理
导读:我不确定我是否可以这样做,但我正在构建一个应用程序的服务层,需要将一种类型的实体添加到另一个实体.一个例子可能是在一个类别中添加一篇文章.它通过服务类完成此操作,例如: public class ArticleService { public IResponse AddArticleToCategory(IAddRel
我不确定我是否可以这样做,但我正在构建一个应用程序的服务层,需要将一种类型的实体添加到另一个实体.一个例子可能是在一个类别中添加一篇文章.它通过服务类完成此操作,例如:
public class ArticleService { public IResponse AddArticleToCategory(IAddRelatedItemRequest<Category,Article> request) { // do stuff with the request } } 我希望IAddRelatedItemRequest接口是通用的,因此它可以用于任何添加请求,类似于: public interface IAddRelatedItemRequest<T,U> where T : class where U : class { Object Key { get;set; } List<Object> RelatedKey { get;set; } } 发生的是该请求需要项目的主键(例如类别)和相关项目(例如文章)的主键列表.具体的ArticleService中的AddCommentToArticle类然后通过其键检索项目,然后将相关的关键项添加到其中. (NB我不想发生的是提供实际实体和相关实体列表 – 它需要通过原始主键完成) 我想以某种方式强烈地键入请求,因此我可以提供(例如)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; } 然后,您将在服务方法中使用相应的密钥解析器.密钥解析器可以是您服务中的属性,也可以根据需要实例化相应的密钥解析器.当您的基础持久性机制本身是通用的(例如,通用的Repository实现)时,类似于密钥解析器的东西非常有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |