根据业务规则选择服务实现

时间:2012-09-20 19:52:59

标签: c# architecture inversion-of-control loose-coupling

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

这一切都很好,但是应该使用的确切服务将根据我们正在操纵的实体的属性而变化(基本上,基于与实体相关的客户)。我想保持行动松散地与它可能需要调用的服务风格相结合。

我正在考虑做的是实施一个接受该实体并返回正确服务的工厂。不过,这看起来有些愚蠢。有没有更好的方法来设置它?

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

3 个答案:

答案 0 :(得分:0)

我建议您仔细查看MEF (Managed Extensibility Framework)。这提供了一种非常不可知的松耦合,它紧密地(如果不完全)符合您的要求。

答案 1 :(得分: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

向下滚动到域事件。

答案 2 :(得分:0)

我认为对于这次迭代,我们将保持简单并使用工厂选择适当的接口(即我认为原始帖子中的“kludgy”解决方案)。感谢您的所有反馈!