0

我正在使用ASP.NET MVC 4 RC最新版本的MvcExtensionsand MvcExtensions.Autofac

我不知道 MVC 4 的工作方式是否与 MVC 3 不同?下面的代码是我在 MVC 3 应用程序中使用它的方式。我刚刚将它复制并粘贴到我的 MVC 4 应用程序中。

我将 Global.asax.cs 文件替换为如下所示:

public class MvcApplication : AutofacMvcApplication
{
     public MvcApplication()
     {
          Bootstrapper.BootstrapperTasks
               .Include<RegisterAreas>()
               .Include<RegisterControllers>()
               .Include<RegisterRoutesBootstrapper>()
               .Include<AutoMapperBootstrapper>()
               .Include<FluentValidationBootstrapper>();
     }

     protected override void OnStart()
     {
          FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

          base.OnStart();
     }
}

RegisterRoutesBootstrapperAutoMapperBootstrapper并且FluentValidationBootstrapper是我的自定义引导程序类。AutoMapperBootstrapper 的代码如下所示:

public class AutoMapperBootstrapper : BootstrapperTask {
     public override TaskContinuation Execute()
     {
          const string mappingNamespace = "MyProject.DomainModel.Mappings";

          IEnumerable<Type> mappingTypes = typeof(IEntity).Assembly
               .GetTypes()
               .Where(
                    type =>
                    type.IsPublic &&
                    type.IsClass &&
                    !type.IsAbstract &&
                    !type.IsGenericType &&
                    type.Namespace == mappingNamespace);

          mappingTypes.ForEach(t => Activator.CreateInstance(t));

          return TaskContinuation.Continue;
     } }

它用蓝色下划线 IEnumerable 并显示错误:

The type 'System.Web.Mvc.Controller' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

好的,所以当我编译我的项目时,它正在寻找 ASP.NET MVC 3 参考:

The type 'System.Web.Mvc.IViewPageActivator' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.  There about 10 such errors relating to the AutoMapperBootstrapper.cs file.

我没有打扰这个参考并添加了 MVC 4 参考。我认为这会解决我的领域问题,但事实并非如此。

任何想法为什么它要求 MVC 参考?

4

3 回答 3

1

添加绑定重定向应该对您有所帮助。至少添加以下重定向:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

另外,考虑使用 hazzik 建议的类型加载。

于 2012-07-31T19:57:14.643 回答
0

问题出在以下几行:

typeof(IEntity).Assembly
    .GetTypes()

请参阅Jon Skeet 的这个答案,他解释了为什么会发生这种情况以及如何处理它。

您还可以查看Phil Haack的文章“Get All Types in an Assembly”

于 2012-07-30T11:28:07.037 回答
0

我猜想MvcExtensionsMvcExtensions.AutofacNuGet 包是针对 ASP.NET MVC 3 编译的,并且对 System.Web.Mvc V3.0.0.0 有很强的引用。它们与 ASP.NET MVC 4 不兼容。您必须联系这些包的作者,以便为您提供针对 ASP.NET MVC 4 编译的更新版本。请记住,ASP.NET MVC 4 尚未达到 RTM然而,所以不要指望所有的 NuGet 包都会立即获得它的更新版本。

于 2012-07-27T12:47:21.567 回答