ASP.NET MVC2 и MEF. Почему мой MefControllerFactory не может получить экспорт или метаданные? - PullRequest
3 голосов
/ 14 февраля 2011

Я слежу за этим сообщением в блоге: http://blog.maartenballiauw.be/post/2009/04/21/ASPNET-MVC-and-the-Managed-Extensibility-Framework-%28MEF%29.aspx и у меня возникают трудности с реализацией MefControllerFactory.

MefControllerFactory Code

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 или Metadata.Ребята, у вас есть какие-нибудь мысли?

Редактировать

Я изменил строку:

 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();

Это позаботилось о моемпроблемы с Metadata.Но теперь у меня есть новая ошибка со следующим оператором 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?)

Ответы [ 2 ]

5 голосов
/ 14 ноября 2011

также вы можете использовать:

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();

также вам нужно реализовать функцию IControllerFactory =>

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

новый экспорт
IControllerFactory-реализация

5 голосов
/ 15 февраля 2011

Этот пост был основан на предварительной версии MEF. API изменился до финальной версии, вы должны использовать export.Value вместо export.GetExportedObject().

...