【问题标题】:Visual Studio C# Solution with many Projects (Dependencies)具有许多项目(依赖项)的 Visual Studio C# 解决方案
【发布时间】:2016-12-05 11:48:22
【问题描述】:

我有一个具有以下结构的 c# WebAPI 应用程序

该解决方案有许多项目,核心项目是实际的 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 的定义在核心项目中,每个外部系统都有自己的接口实现。 因此,将使用哪个实现的决定是在核心项目的 web 配置文件中定义的。 这种实现有一个问题。当我创建我的发布 dll 时,我必须包含所有外部系统的 Dll(即使它们没有被使用),否则 像这样的代码行

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

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

【问题讨论】:

  • 这个问题不清楚。你说的是安装人员吗?
  • 不,它是一个 web api 应用程序。没有安装程序。问题是我需要为不同的客户在许多服务器上上传我的应用程序。客户 A 使用外部系统 A,客户 B 使用外部系统 B,依此类推。使用当前架构,我必须将所有外部系统中的所有 dll 上传给所有客户......
  • 为什么这是个问题?将所有 dll 放在所有服务器上并通过配置进行控制。我看不出你已经拥有的东西有什么问题?
  • 看起来并不优雅。我想知道是否存在更好的方法
  • 但是没坏?为什么要修?据我所知,添加一个复杂的结构,这样您就不必发送一些额外的 kb 文件似乎超过了杀戮

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


【解决方案1】:

也许使用条件语句可以工作。 而不是这个:

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

【讨论】:

  • 我只是意识到项目参考可能仍然使您难以甚至不可能实现您的目标。也许只部署需要的东西会起作用,但您必须尝试找出答案。
  • 这仍然需要包含所有 dll (我认为这是 OP 的目的)。顺便说一句,预编译器使用语句进行优化,因此未使用的引用在编译时被删除。
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多