C# 基于业务规则选择服务实现

C# 基于业务规则选择服务实现,c#,architecture,inversion-of-control,loose-coupling,C#,Architecture,Inversion Of Control,Loose Coupling,在我正在处理的应用程序中,当一个新实体添加到存储库时,我们会触发一些操作。其中一个新操作应该是在对象进入时使用服务(如服务层,而不是以太中的某个web服务)来执行一些业务规则操作 这一切都很好,但应该使用的确切服务将根据我们正在处理的实体的属性而有所不同(基本上,基于该实体与哪个客户相关)。我希望保持操作与它可能需要调用的服务的风格松散耦合 我想做的是实现一个工厂,它将接受实体并返回正确的服务。不过,这似乎有点笨拙。有没有更好的方法来设置这个 我曾考虑过在运行时使用IoC容器来确定正确的实现,但

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

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

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


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

我建议您仔细研究一下。这提供了一个非常不可知的松散耦合,非常适合您的需求。

您的做法是错误的。您应该为此使用事件:

// your repository event
public class ItemCreated<T>
{
}
//您的存储库事件
已创建公共类项
{
}
处理程序:

public class DoSomething : ISubscribeOn<ItemCreated<User>>
{
    public class DoSomething(ISomeService)
    {}
}
公共类DoSomething:iSubscribeen
{
公共类剂量测定(等轴服务)
{}
}
请注意,订阅活动的不是服务本身,而是中间人。它使事情不那么解耦

所有这些都内置在我的IoC容器中:


向下滚动到域事件。

我认为对于这个迭代,我们将保持它的简单性,并使用工厂来选择合适的接口(即,我在原始帖子中认为的解决方案是“笨拙的”)。感谢所有的反馈

Factory
方法对于这样的事情来说几乎是正确的设计。你为什么认为这是“有点麻烦”?我不确定。我想我只是不喜欢在某个地方用一个巨大的switch语句来提供服务。似乎应该有一种更优雅的方式。所以,我想我会检查一下,看看是否有其他人知道这件事好吧,如果这就是类/方法所做的,而且很明显这就是它的工作。。。总比试图“聪明”好。这与应用程序今天的工作方式几乎相同,并且可以与更改一起工作。主要问题是如何根据
用户
的属性,使用工厂和服务地点选择
ISomeService
的实现