2012-09-20 39 views
0

在我正在处理的应用程序中,我们有一些操作会在将新实体添加到存储库时触发。其中一项新操作应该使用服务(如服务层,而不是以太网某处的Web服务)来执行某些商业规则操作。根据业务规则选择服务实现

这是一切都很好,但是应该使用确切的服务会根据我们操纵的实体的属性(基本上,根据实体与哪个客户有关)而变化。我希望保持松散的行动,以适应可能需要调用的服务。

我想要做的是实现一个工厂,它将接受实体并返回正确的服务。不过,这看起来有点不方便。有没有更好的方法来设置它?

我曾经考虑过在运行时使用IoC容器来确定正确的实现,但仔细阅读一对(Ninject和Windsor)似乎并不表示它们非常适合这种操作。

+1

'工厂'方法几乎是这样的事情的正确设计。你为什么这是“有点傻”? – Oded

+0

我不确定。我想我只是不喜欢在某处放出服务的巨大转换语句的想法。似乎应该有一个更优雅的方式。所以,我想我会检查是否有其他人知道。 :) – Michael

+1

那么,如果这是所有的类/方法正在做,显然这是它的工作......比试图对它“聪明”更好。 – Oded

回答

0

我认为这个迭代,我们会保持简单,并使用工厂来选择适当的界面(即我认为原始帖子中的“kludgy”)解决方案。感谢所有的反馈!

0

你接近这个错误的方式。你应该用事件这样的:

// your repository event 
public class ItemCreated<T> 
{ 
} 

的处理程序:

public class DoSomething : ISubscribeOn<ItemCreated<User>> 
{ 
    public class DoSomething(ISomeService) 
    {} 
} 

注意,它不是服务本身,而是一个中间人,关于事件的订阅。它使事情更少解耦。

所有这一切都被内置到我的IoC容器:http://www.codeproject.com/Articles/440665/Having-fun-with-Griffin-Container

向下滚动到域中的事件。

+1

这与应用程序今天的工作方式几乎完全相同,并且可以与更改一起工作。主要问题是如何根据'User'的属性选择'ISomeService'的实现。 – Michael

+0

使用工厂和服务地点 – jgauffin