解决方案包含许多项目,核心项目是实际的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,依此类推。 这可能吗?
答案 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