好的,所以我对以下数据的情况有点困惑。
我们的应用程序中有以下结构:
- Portal.Web-一个MVC 3 Web应用程序,它基本上包含所有视图、脚本、css和HTML助手扩展方法
- Portal.Core-一个类库,基本上是我们的业务对象,我们的所有模型都包含在这个项目中
- Portal.Data-另一个类库,包含我们的NHibernate配置和DTO类
以下是我们的用法:在控制器中,我们调用位于Portal.Core中的模型,它通过调用Portal.Data来填充,所以基本上Web永远看不到数据。
问题是:在控制器中,例如,我尝试实例化一个名为Client的新DTO对象,如下所示:
var client = new Client();
它不起作用,这是意料之中的,它不知道客户端是什么,即使指定使用也不会减少它。这很好。
但是如果我尝试在视图中执行完全相同的行,Resharper将使用添加到视图中,然后没有任何抱怨,项目运行,我们可以在视图中使用DTO类。
所以问题是,为什么会这样?我试图阻止我们的下级在视图中使用DTO类,所以我特意删除了对Web中Data项目的引用,但他们仍然可以使用这些类。有人能照亮吗?
我使用ASPX和Razor视图运行了相同的测试。在ASPX视图中引用Client
失败,但在Razor视图中它们可以工作。当您请求应用程序时,视图是动态编译的,所以我查看了"C:\Windows\Microsoft.NET\Framework\v4.0.30119\Temporary ASP.NET Files\portal.web"中的一些文件夹,并且在编译视图时,从cmdline文件中显式添加了对程序集的引用。
编译剃刀视图的过程似乎添加了对bin文件夹中所有程序集的引用。然而,从ASP.NET MVC的来源来看,我无法证实这一点。
所以,我能得出的唯一结论是,这是使用Razor视图引擎的副作用。
也就是说,您可能需要扫描web.config,看看它是否使用assemblys元素包含。