Solved

C# Generic Messaging Pattern

Posted on 2011-09-08
1
287 Views
Last Modified: 2012-05-12
I'm not sure if I can do this or not, but I am building the service layer of an application which needs to add one type of entity to another. An example might be adding an article to a category. It does this through a service class, for example:
 
 
public class ArticleService { 
     public IResponse AddArticleToCategory(IAddRelatedItemRequest<Category, Article> request) { 
     // do stuff with the request 
     } 
}

Open in new window


I would like the IAddRelatedItemRequest interface to be generic so it can be used for any addition request, similar to:

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

Open in new window


What is happening is that the request requires the primary key of the item (e.g. the category) and a list of the primary keys of the related items (e.g. the articles). The AddCommentToArticle class in the concrete ArticleService then retrieves the item by its key and then adds the related key items to it.   Note that the primary keys of the entities are not necessarily integers, they could be uniqueidentifiers.

I want to strongly type the request somehow, so instead of an object and a list of objects being supplied, the interface takes the types of the primary keys of the two entities.

The intereface would then look something like

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

Open in new window


Obviously this code is not correct but illustrates the end result.

Ideally I would like to somehow extract the type of the entity's Id from the generic type and include that in the interface. Is this possible?

Note:
What I don't want to happen is supply the actual entity and a list of related entities - it needs to be done through primitive primary keys.
I don't particularly want to supply the two types through Generics as it makes for less readable code and the keys of the objects could potentially change type.
0
Comment
Question by:pipelineconsulting
1 Comment
 
LVL 16

Accepted Solution

by:
SriVaddadi earned 500 total points
ID: 36539443
Define an interface  
like
interface IPrimaryKey
{
    T Key {get;set;}
    List<T> RelatedKey {get;set;}
}

public interface IAddRelatedItemRequest<T, U>
where T : class
where U : IPrimaryKey

Means that your Article class has to implement IPrimaryKey interface and could specify the type

HTH
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

SQL Server engine let you use a Windows account or a SQL Server account to connect to a SQL Server instance. This can be configured immediatly during the SQL Server installation or after in the Server Authentication section in the Server properties …
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now