Alternatives to type casting in your domain

Posted by Mr Happy on Programmers See other posts from Programmers or by Mr Happy
Published on 2012-10-23T09:58:49Z Indexed on 2012/10/23 11:18 UTC
Read the original article Hit count: 247

Filed under:
|
|

In my Domain I have an entity Activity which has a list of ITasks. Each implementation of this task has it's own properties beside the implementation of ITask itself. Now each operation of the Activity entity (e.g. Execute()) only needs to loop over this list and call an ITask method (e.g. ExecuteTask()).

Where I'm having trouble is when a specific tasks' properties need to be updated. How do I get an instance of that task? The options I see are:

  • Get the Activity by Id and cast the task I need. This'll either sprinkle my code with:
    • Tasks.OfType<SpecificTask>().Single(t => t.Id == taskId)
    • or Tasks.Single(t => t.Id == taskId) as SpecificTask
  • Make each task unique in the whole system (make each task an entity), and create a new repository for each ITask implementation

I don't like either option, the first because I don't like casting: I'm using NHibernate and I'm sure this'll come back and bite me when I start using Lazy Loading (NHibernate currently uses proxies to implement this). I don't like the second option because there are/will be dozens of different kind of tasks. Which would mean I'd have to create as many repositories.

Am I missing a third option here? Or are any of my objections to the two options not justified? How have you solved this problem in the past?

© Programmers or respective owner

Related posts about c#

Related posts about polymorphism