跨Web和Winforms /控制台解决方案共享项目的正确方法是什么?

问题描述:

我将.NET 2.0 Winforms应用程序转换为ASP.NET MVC3。 Winforms解决方案为业务逻辑使用多个项目,而MVC应用程序包含这些项目。这些项目也被各种Windows控制台应用程序使用。跨Web和Winforms /控制台解决方案共享项目的正确方法是什么?

问题是这些项目使用System.Windows.Forms.Application.StartupPath找到他们使用的文件,而对于web开发System.Web.HttpRunTime.AppDomainAppPath被使用。

我宁愿两个解决方案都使用相同的项目,并且这些项目的修改尽可能少,因为它们很大,很旧,而且相对没有记录。解决这个问题的正确方法是什么?

现在我想我会创建一个新的配置,每个项目将定义WEB,然后使用#if/#else语句包含正确的依赖关系并定义getPath()方法的返回值。

你开始预处理器困扰你的代码之前,你应该考虑创建一个接口IApplicationConfiguratorIApplicationStarter

public interface IApplicationStarter 
{ 
    string GetPath(); 
} 

并与根据您的应用程序MvcApplicationStarterWinformsApplicationStarter注入它。然后你可以让你的项目库依赖于IApplicationStarter接口。它应该在项目上需要最少的实现,并且可以将该模式用于其他常见依赖项。看看dependency injection frameworks,因为它需要这种方法进入下一个的水平。

这是类库的用途。创建一个类库项目,将所有常用位移到那里,然后有一个单独的WinForms和MVC项目,它们都引用了你的类库。

+0

具体来说,这些类将具有相同的代码,但仍然能够根据实例化它们而得到不同的结果? – user1 2013-03-05 21:52:12

+1

但是你喜欢。最简单的方法是在构造函数中传递区分符。 – 2013-03-05 21:57:44