简体   繁体   English

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

[英]ASP.NET MVC2 and MEF - Why can't my MefControllerFactory get exports or MetaData?

I am following this blog post: http://blog.maartenballiauw.be/post/2009/04/21/ASPNET-MVC-and-the-Managed-Extensibility-Framework-%28MEF%29.aspx and I'm having dificulty implementing the MefControllerFactory . 我正在关注这篇博文: http//blog.maartenballiauw.be/post/2009/04/21/ASPNET-MVC-and-the-Managed-Extensibility-Framework-%28MEF%29.aspx我正在实现MefControllerFactory

MefControllerFactory Code 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
    }
}

The errors I'm getting are: 我得到的错误是:

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?)   

I'm rather confused as to why this wouldn't recognize Export or Metadata . 我很困惑为什么这不会识别ExportMetadata Do you guys have any thoughts? 你们有什么想法吗?

Edit 编辑

I changed the line: 我换了一行:

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

To: 至:

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

That took care of my issues with Metadata . 这解决了我在Metadata方面的问题。 But now i hev a new error with the next if statement: 但是现在我用下一个if语句引发了一个新错误:

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

error: 错误:

 '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?)

That blog post was based on a preview version of MEF. 该博客文章基于MEF的预览版。 The API changed before the final release, you should use export.Value instead of export.GetExportedObject() . API在最终版本发布之前已更改,您应该使用export.Value而不是export.GetExportedObject()

also you can use : 你也可以使用:

Lazy<IController> export = this.container.GetExports<IController, IDictionary<string, object>>()
    .Where(c => c.Metadata.ContainsKey("ControllerName")
        && c.Metadata["ControllerName"].ToString().ToLowerInvariant().Equals(controllerName.ToLowerInvariant())).
            FirstOrDefault();

also , you need to implements the IControllerFactory function = > 另外,您需要实现IControllerFactory函数=>

public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName)
        {
            return SessionStateBehavior.Default;
        }

new export 新出口
icontrollerfactory-implementation icontrollerfactory的实现

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM