ASP.NET MVC 3.0 + Microsoft.Web.Mvc 3.0 + MEF兼容性

时间:2011-02-13 05:43:53

标签: asp.net-mvc-3 mef

当我在ASP.NET MVC 3.0项目中引用Microsoft.Web.Mvc.dll时,我在DirecotryCatalog中构建CustomDependencyResolver时出现错误。

string path = HostingEnvironment.MapPath("~/bin");
 var container = new DirectoryCatalog(path); 

然后我看了container.Parts.Results View.LoadedExeptions并且说:

+ [0] {“方法'GetControllerSessionBehavior'类型'Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory'来自程序集'Microsoft.Web.Mvc,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = null'没有实现。“:”Microsoft.Web.Mvc.MvcDynamicSessionControllerFactory“} System.Exception {System.TypeLoadException}

来自程序集'Microsoft.Web.Mvc,Version = 3.0.0.0,Culture = neutral'的类型'Microsoft.Web.Mvc.Resources.ResourceControllerFactory'中的

+ [1] {“方法'GetControllerSessionBehavior' ,PublicKeyToken = null'没有实现。“:”Microsoft.Web.Mvc.Resources.ResourceControllerFactory“} System.Exception {System.TypeLoadException}

只是为了测试我删除了对Microsoft.Web.Mvc.dll的引用(从bin direcotry中物理删除它)然后一切都很好。看起来无法加载Microsoft.Web.Mvc.dll。

有什么工作吗?

我在这里找到了类似的问题http://forums.asp.net/t/1622399.aspx?MVC+3+RC.+Where+is+the+Futures+Assembly%3F答案说MVC 3 Beta Futures + MVC 3 RC Runtime =不兼容。但我正在使用两个RTM版本:

Microsoft.Web.Mvc 运行时版本v4.0.30319,版本3.0.0.0(从此处下载http://mvccontrib.codeplex.com/releases/view/59313

System.Web.Mvc 运行时版本v4.0.30319,版本3.0.0.0

更新:

正如Darin Dimitrov在回答中所说,我需要从扫描过程中排除System.Web.Mvc。 以下是如何做到这一点:

public class SafeDirectoryCatalog : ComposablePartCatalog
{
    private readonly AggregateCatalog _catalog;

    public SafeDirectoryCatalog(string directory)
    {
        var files = Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories);

        _catalog = new AggregateCatalog();

        foreach (var file in files)
        {
            try
            {
                var asmCat = new AssemblyCatalog(file);

                //Force MEF to load the plugin and figure out if there are any exports
                // good assemblies will not throw the RTLE exception and can be added to the catalog
                if (asmCat.Parts.ToList().Count > 0)
                    _catalog.Catalogs.Add(asmCat);
            }
            catch (ReflectionTypeLoadException)
            {
            }
        }
    }
    public override IQueryable<ComposablePartDefinition> Parts
    {
        get { return _catalog.Parts; }
    }
}

2 个答案:

答案 0 :(得分:4)

MEF扼流圈,因为它正在扫描包含接口和类的bin文件夹中的所有程序集,并且实现MvcDynamicSessionControllerFactory的{​​{1}}类恰好被密封。因此,我在此处看到的唯一解决方案是从此扫描进程中排除IControllerFactory程序集。我不熟悉MEF,但在StructureMap中有同样的问题,你可以排除类型。

答案 1 :(得分:0)

将来,当您尝试从多个位置加载相同的程序集时,可能会帮助其他人知道您也可以获得此异常。

在我的情况下,我更改了我正在处理的插件程序集的构建放置位置,而不是从以前的位置清除它。结果,应用程序从两个位置加载相同的程序集并清除此异常。清理构建下降解决了这个问题。

SafeDirectoryCatalog对于不会导致应用程序崩溃很有帮助/便利,但MEF仍然无法加载程序集。