事实
我有两个 VS2010 C# 单项目解决方案:
- 提供有关管理日历的功能的类库。我们称它为Manager。https://www.dropbox.com/s/ldjhtn4yxajss7y/Manager.png
- 想要使用此功能的控制台应用程序。我将其称为Client。https://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 项目来连接Client和Manager,这将提供一个负责的类:
- 启动和维护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 中的问题的指导
- 指出剩下的哪些想法是最合理的(或如何改进它们)
- 另一个想法,如果上面的那些不只是削减它并且你知道更好的方法
对不起
为了让这个问题成为一个讲座,我真的认为它可以用五句话来解释。失败了;)