0

事实

我有两个 VS2010 C# 单项目解决方案:

  1. 提供有关管理日历的功能的类库。我们称它为Managerhttps://www.dropbox.com/s/ldjhtn4yxajss7y/Manager.png
  2. 想要使用此功能的控制台应用程序。我将其称为Clienthttps://www.dropbox.com/s/i4xiuy598ixereg/Client.png

目标

这两个项目都在开发中,所以如果我可以在一个解决方案中轻松地处理它们,并且每次修改都同时编译它们,那将是完美的。这样开发既快速又简单,因为查找定义有效,我可以同时在两个项目中重构 -> 重命名,调试问题更加精确。


想法

...我想出了,没有一个能像预期的那样完美无瑕,每一个都有它的缺点。


1.将现有的Manager项目添加到Client解决方案中(作为参考)

我个人的梦想。它看起来像这样:dropbox.com/s/od7f2n12vw48xdx/Idea1.png

实现的目标:

  • 构建客户端也强制使用最新代码构建管理器
  • 可以在一个解决方案中开发两个项目

未实现的目标:

  •  

完美的!但...

意外问题:

  • Visual Studio 强制我引用 Manager 中使用的所有库,以及用于绑定重定向的 app.config 文件。这造成了混乱,因为在这两个项目中, References中都有复制的程序集列表,需要手动维护——即使我使用了 NuGet 自动化,它仍然有太多冗余;将所有内容复制两次并不是我期望类库的行为
    dropbox.com/s/xvrl639f5z9sw54/Idea1Problem.png

这让我想到了其他解决方法:


2.重写Manager类库只使用REST HTTP通信

实现的目标:

  • 和想法1一样,很好
  • 只有一个依赖项 - Manager程序集,它甚至更好

缺点:

  • CalendarService重写一个已经由谷歌提供的已经很复杂、成熟的类是没有意义的,是吗?
  • 开发将花费更多时间

可预见的问题:

  • 我有一种预感,无论如何,我最终会在Client项目中拥有多个必需的依赖项
  • 在那种情况下,我应该坚持想法 1,而花在这个想法上的任何时间都将完全浪费

3. 将管理器降级为控制台应用程序。保持它和客户分开和独立

Manager 将是一个守护进程,它在活动时等待命令,执行它们并保持打开状态,直到请求退出,就像cmd在 Windows 中一样。然后需要一个Mediator /*Translator* man-in-the-middle 项目来连接ClientManager,这将提供一个负责的类:

  • 启动和维护Manager应用程序
  • 客户可以调用客户源代码Mediator.InsertEvent(Description,StartDate,Duration)中的方法
  • 将这些调用转换为管理器命令,例如ManagerProcess.WriteLine("insert description start duration")
  • 解析其结果并将其传达给客户端

实现的目标:

  • 避免依赖地狱=征服主要敌人
  • 客户按预期工作

但...

未实现的目标:

  • 项目没有与一种解决方案相关联,所有缺点由此产生

缺点:

  • 需要维护第三个项目作为互通层
  • 开发时间增加,但可能比使用创意 2 时要少
  • 如果在开发过程中 Client 本身变成了一个守护进程,将会有两个后台应用程序在运行,而一个应该足以轻松完成工作

4. 更进一步,用Mediator做一个 Windows 服务

实现的目标:

  • 与想法 3 相同
  • 不确定,但不需要Mediator类 - 可能会直接调用服务

未实现的目标:

  • 项目没有与一种解决方案相关联,所有缺点由此产生

缺点:

  • 两个字:需要管理员权利。好吧,三个字:愿意一个矫枉过正对于. 作为. 简单应用程序作为. . . 要求管理员权利
  • 如果在开发过程中 Client 本身变成了一个守护进程,将会有两个后台应用程序在运行,而一个应该足以轻松完成工作

5. 放弃内存交互的希望,通过物理 iCalendar 文件与Manager通信Client

客户端创建一个带有要插入的事件的 .ics 文件,以 .ics的文件路径作为参数启动Manager , Manager插入事件

实现的目标:

  • ...有一个可以将某些内容放入日历的客户项目吗?

未实现的目标:

  • 项目没有与一种解决方案相关联,所有缺点由此产生

缺点:

  • 通过硬盘交互。怜悯...
  • 每次调用Manager来创建或更新日历事件时,它都会登录

不过是个想法。


我需要你什么

任何一个:

  • 如何处理理念 1 中的问题的指导
  • 指出剩下的哪些想法是最合理的(或如何改进它们)
  • 另一个想法,如果上面的那些不只是削减它并且你知道更好的方法

对不起

为了让这个问题成为一个讲座,我真的认为它可以用五句话来解释。失败了;)

4

2 回答 2

2

您需要共享程序集的原因是您具有共享逻辑。我要做的是引入第三个程序集/项目,称为 Core 或类似的东西,并在那里集中/统一您的共享逻辑......使 Core 成为引用的包装器并仅公开您的方法。然后使用客户端和经理来引用该项目并调用这些方法。

代替:

client  --> tons of references
manager --> tons of references

你得到:

core    --> tons of references
client  --> core
manager --> core
于 2013-11-11T22:08:03.913 回答
1

看起来您正在尝试开发一个类库并同时开发一个依赖于该类库的应用程序。

我的建议是试试这个:

  1. 首先开发应用程序,同时使您打算包含在类库中的代码尽可能可重用。

  2. 一旦您完成了您打算包含在类库中的类/接口的开发,将该代码分离到您的应用程序引用的单独库中。

为简单起见,我建议将这种修改后的方法用于实现第三个程序集,该程序集可以为您的引用实现一个包装器对象。

查看 Jeff Atwoods 关于三法则的帖子,了解我的意思。

您希望在库中开发的可重用代码类型将是一个不断发展的过程,与您的应用程序相比,这将涉及更多的思考和返工。这并不意味着将所述代码作为现有应用程序中的模块化组件开始是一个坏主意。

于 2013-11-11T22:21:13.247 回答