【问题标题】:Compilation conditions of a library according to project referencing根据项目引用的库的编译条件
【发布时间】:2013-07-20 12:23:57
【问题描述】:

我有两个项目和一个可移植库。这两个项目都引用了这个库。该库有什么方法可以为两个项目中的每一个提供两种不同的方法实现?

例如,项目是服务器和客户端,并且库有一个类,其中有一个名为 SendItem 的方法。

服务器对 SendItem 的实现:

Send(ID);
Send(Name);
Send(Price);

客户端对 SendItem 的实现:

Send(ID); //Server will retrieve rest of information from database

我宁愿不使用额外的参数来指示哪个项目正在调用该方法,因为该方法被许多类调用,并且事情会变得丑陋和复杂。有什么方法可以使用编译条件来完成吗? (可以为每个引用它的项目多次编译库吗?)。

如果使用编译条件无法实现这一点,是否有任何干净的方法可以做到这一点而不会搞砸其他事情?

【问题讨论】:

  • 如果实现因调用者不同而不同,则应将其拆分为两个函数
  • 这是唯一的方法吗?
  • 它不仅是方法,而且是正确的方法,为什么你会在同一个函数中有 2 个不同的实现,也许你需要 2 个类,一个用于客户端,一个用于服务器
  • 我有许多需要在客户端和服务器之间发送的对象(订单、菜单、项目等)。我不认为仅仅为了两种方法就必须实现这些类两次(实际上是 3 次,因为我也有一个管理员项目)是一个好方法。如果没有其他方法,我会将其拆分为两个函数,尽管结果会变得一团糟(我需要做很多修改)。

标签: c# portability portable-class-library


【解决方案1】:

查看服务定位器或控制反转 (IoC) 模式。 Daniel 写了一篇关于如何将其应用于可移植库的很好的文章:http://blogs.msdn.com/b/dsplaisted/archive/2012/08/27/how-to-make-portable-class-libraries-work-for-you.aspx

【讨论】:

    【解决方案2】:

    您可以使用 C# 预处理器指令执行类似的操作,类似于在 C/C++ 中完成的方式,但是以这种方式编写的代码更难维护,并且随着时间的推移变得更加脆弱。最好编写几个不同的函数,而不是把代码弄得乱七八糟:

    #if (ANYTHING)
      Console.WriteLine("ANYTHING is defined");
    #else
      Console.WriteLine("ANYTHING is NOT defined");
    #endif
    

    你明白了。

    这是对 MSFT 预处理器信息的参考,因此您可以阅读它: http://msdn.microsoft.com/en-us/library/ed8yd1ha(v=vs.71).aspx

    【讨论】:

    • 我尝试在客户端项目中定义符号,但可移植类库无法访问它。我需要在库中定义符号,但我不能这样做,因为每个引用库的项目都应该有不同的方法编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多