客户特定库/插件的代码结构

时间:2012-07-03 13:48:46

标签: c# asp.net-mvc architecture

所以这就是问题所在:

我的应用程序中有一些逻辑在客户端基础上会有所不同。构建此结构的最佳方法是什么,以便可以在不更改任何代码的情况下对其进行配置。我已经在配置中添加了一个appsetting,如下所示:

<add key="MyCalculationType" value="MyApp.Client1.Calculation,MyApp.Client1" />

在我的核心业务逻辑中:

ICalculation abcCalculation = CalculationFactory.GetManager(); // Uses appsetting to get type

abcCalculation.Calculate(this);

我添加了一个名为MyApp.Client1的新项目,我想要包含客户特定的Calculate实现。

namespace MyApp.Client1
{
    public class Calculation : ICalculation
    {
        public void Calculate(Order o)
        {
            // Calculate properties of order
        }
    }
}

我还没有完成,所以我无法提供任何输出。在这个阶段,我想知道,在我进一步讨论之前,是否有更好的方式来实现我想要的东西。我不确定的一件事是放置ICalculation接口的位置。我认为我的方式可能会给出循环引用错误。

非常感谢

修改

我怀疑,ICalculation界面阻止我建立。虽然没有循环参考错误;带有“无法解决符号”错误。

2 个答案:

答案 0 :(得分:1)

ICalculation接口可以位于 ConnectorBridge 库中,该库管理外部插件与主机环境的访问,订阅和通信。

您的应用程序和(比方说)计算项目都包含对 ConnectorBridge 的引用。通过这种方式,Calculation可以实现ICalculation接口,并且appliaction可以访问抽象。

在您的应用程序中创建一个文件夹,例如插件,在您的应用程序启动时,您扫描该文件夹的内容以查找DLL的实现ICalculation接口的当前类型。一旦找到类型(在这个特定情况下为计算器),它就会被创建,并保存在应用程序中以供将来执行。

这些只是一个想法的混合,但具体的实现,自然需要更多的工作。

希望这有帮助。

答案 1 :(得分:0)

如果你真的需要做那种事情,你应该找一个合适的Inversion of Control容器。我更喜欢NInject,因为它非常强大且非常易于配置。