编程语言
首页 > 编程语言> > c# – ASP.NET MVC2和MEF – 为什么我的MefControllerFactory不能获得导出或MetaData?

c# – ASP.NET MVC2和MEF – 为什么我的MefControllerFactory不能获得导出或MetaData?

作者:互联网

我正在关注这篇博文:http://blog.maartenballiauw.be/post/2009/04/21/ASPNET-MVC-and-the-Managed-Extensibility-Framework-%28MEF%29.aspx,我正在实施MefControllerFactory.

MefControllerFactory代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Web.Mvc;

namespace plugme.Utilities
{

    public class MefControllerFactory : IControllerFactory
    {
        private string pluginPath;
        private DirectoryCatalog catalog;
        private CompositionContainer container;

        private DefaultControllerFactory defaultControllerFactory;

        public MefControllerFactory(string pluginPath)
        {
            this.pluginPath = pluginPath;
            this.catalog = new DirectoryCatalog(pluginPath);
            this.container = new CompositionContainer(catalog);

            this.defaultControllerFactory = new DefaultControllerFactory();
        }

        #region IControllerFactory Members

        public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
        {
            IController controller = null;

            if (controllerName != null)
            {
                string controllerClassName = controllerName + "Controller";

                // "Export" isn't recognized
                // and "Metadata" (as in c => c.Metadata ) isn't recognized.
                Export<IController> export = this.container.GetExports<IController>()
                                                 .Where(c => c.Metadata.ContainsKey("controllerName")
                                                     && c.Metadata["controllerName"].ToString() == controllerName)
                                                 .FirstOrDefault();
                if (export != null)
                {
                    controller = export.GetExportedObject();
                }
            }

            if (controller == null)
            {
                return this.defaultControllerFactory.CreateController(requestContext, controllerName);
            }

            return controller;
        }

        public void ReleaseController(IController controller)
        {
            IDisposable disposable = controller as IDisposable;
            if (disposable != null)
            {
                disposable.Dispose();
            }
        }

        #endregion
    }
}

我得到的错误是:

Error 1 The type or namespace name 'Export' could not be found 
        (are you missing a using directive or an assembly reference?)   

Error 2 'System.Lazy<System.Web.Mvc.IController>' does not contain a 
        definition for 'Metadata' and no extension method 'Metadata' 
        accepting a first argument of type 
        'System.Lazy<System.Web.Mvc.IController>' could be found 
        (are you missing a using directive or an assembly reference?)

Error 3 'System.Lazy<System.Web.Mvc.IController>' does not contain a 
        definition for 'Metadata' and no extension method 'Metadata' 
        accepting a first argument of type 
        'System.Lazy<System.Web.Mvc.IController>' could be found 
        (are you missing a using directive or an assembly reference?)   

我很困惑为什么这不会识别出口或元数据.你们有什么想法吗?

编辑

我换了一行:

 Export<IController> export = this.container.GetExports<IController>()
                                                 .Where(c => c.Metadata.ContainsKey("controllerName")
                                                     && c.Metadata["controllerName"].ToString() == controllerName)
                                                 .FirstOrDefault();

至:

var export = this.container.GetExports<IController>()
                                                 .Where(c => c.Metadata.ContainsKey("controllerName")
                                                     && c.Metadata["controllerName"].ToString() == controllerName)
                                                 .FirstOrDefault();

这解决了我在元数据方面的问题.但是现在我用下一个if语句引发了一个新错误:

            if (export != null)
            {
                controller = export.GetExportedObject(); 
            }

错误:

 'System.Lazy<System.Web.Mvc.IController,System.Collections.Generic.IDictionary<string,object>>' does not contain a definition for 'GetExportedObject' and no extension method 'GetExportedObject' accepting a first argument of type 'System.Lazy<System.Web.Mvc.IController,System.Collections.Generic.IDictionary<string,object>>' could be found (are you missing a using directive or an assembly reference?)

解决方法:

该博客文章基于MEF的预览版. API在最终版本发布之前已更改,您应该使用export.Value而不是export.GetExportedObject().

标签:c,asp-net,asp-net-mvc,asp-net-mvc-2,mef
来源: https://codeday.me/bug/20190721/1496662.html