包含许多项目的Visual Studio C#解决方案(依赖项)

时间:2016-12-05 11:48:22

标签: c# visual-studio projects-and-solutions

我有一个c#WebAPI应用程序,它具有以下结构enter image description here

解决方案包含许多项目,核心项目是实际的WebAPI项目,以及多个用于与外部系统通信的独立项目。 我的项目使用依赖注入,如下所示: 核心项目可能在其Web配置中定义了一个外部系统。 当注册各种依赖项时,存在这样的代码

string ExternalSystem = ConfigurationManager.AppSettings["ExternalService"];
switch(ExternalSystem)
            {
                case "ExtA":
                    this.RegisterType<ExtA.ExternalService>().As<IExternalService>().InstancePerRequest();
                    break;
                case "ExtB":
                    this.RegisterType<ExtB.ExternalService>().As<IExternalService>().InstancePerRequest();
                    break;
                default:
                    this.RegisterType<ExternalService>().As<IExternalService>().InstancePerRequest();
                    break;
            } 

IExternalService的定义在Core项目中,每个Extrnal系统都有自己的接口实现。 因此,将在Core项目的Web配置文件中定义将要使用哪个实现的决定。 这种实现有一个问题。当我创建我的发布dll时,我必须包括所有外部系统的Dll(即使它们没有被使用),否则 像这样的代码行

this.RegisterType<ExtA.ExternalService>().As<IExternalService>().InstancePerRequest();

不会编译。 换句话说,我的应用程序可以从仅与外部系统A通信的客户使用。在此配置中,我想仅包括来自核心项目和外部系统A dll的dll。如果客户使用B,则仅包含B,依此类推。 这可能吗?

1 个答案:

答案 0 :(得分:2)

也许使用条件语句可行。 而不是:

using Lib_ExtA;
using Lib_ExtB;
using Lib_General;

...使用此:

#if UseExtA
using ExternalService = ExtA.ExternalService;
#endif
#if UseExtB
using ExternalService = ExtB.ExternalService;
#endif
#if UseGeneral
using ExternalService = General.ExternalService;
#endif

......紧接着就是:

this.RegisterType<ExternalService>().As<IExternalService>().InstancePerRequest();

你可以将它与switch方法结合起来,如果你做的一切都做了额外的检查,但这基本上意味着你要做两次。

参考文献:

  

#if(C#参考)
  https://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

  

/ define(C#编译器选项)
  https://msdn.microsoft.com/en-us/library/0feaad6z.aspx