【问题标题】:Selecting a service implementation based on business rules根据业务规则选择服务实现
【发布时间】:2012-09-20 19:52:58
【问题描述】:

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

这一切都很好,但应该使用的确切服务将根据我们正在操作的实体的属性(基本上,基于实体与哪个客户相关)而有所不同。我想让动作与它可能需要调用的服务风格保持松散耦合。

我正在考虑做的是实现一个接受实体并返回正确服务的工厂。不过,这似乎有点笨拙。有没有更好的设置方法?

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

【问题讨论】:

  • Factory 方法对于这样的事情几乎是正确的设计。为什么你觉得它“有点笨拙”?
  • 我不确定。我想我只是不喜欢在某处分发服务的巨大 switch 语句的想法。似乎应该有一个更优雅的方式。所以,我想我会检查一下是否有其他人知道。 :)
  • 好吧,如果这就是类/方法所做的全部,那么显然这就是它的工作......总比试图“聪明”地了解它要好。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您以错误的方式处理此问题。您应该为此使用事件:

    // 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

    向下滚动到域事件。

    【讨论】:

    • 这与应用程序今天的工作方式几乎相同,并且将与更改一起工作。主要问题是如何根据User的属性选择ISomeService的实现。
    • 使用工厂和服务地点
    【解决方案3】:

    我认为对于这次迭代,我们将保持简单并使用工厂来选择正确的界面(即我认为在原始帖子中的解决方案是“kludgy”)。感谢所有反馈!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多