使用MEF导入方面不起作用

时间:2013-07-31 20:47:42

标签: asp.net-mvc mef

在我的mvc web应用程序上使用mefcontrib.mvc3。在应用程序启动事件之前使用以下类来初始化mef。该类是从nuget自动生成(下载)的。对目录(插件文件夹)和控制器工厂段应用了一些微小的更改。

[assembly: WebActivator.PreApplicationStartMethod(typeof(OMR.CMS.App_Start.MefContribMVC3), "Start")]

namespace OMR.CMS.App_Start
{
    using System.ComponentModel.Composition.Hosting;
    using System.Linq;
    using System.Web.Mvc;
    using MefContrib.Hosting.Conventions;
    using MefContrib.Web.Mvc;

    public static class MefContribMVC3
    {
        public static void Start()
        {
            // Register the CompositionContainerLifetimeHttpModule HttpModule.
            // This makes sure everything is cleaned up correctly after each request.
            CompositionContainerLifetimeHttpModule.Register();

            // Create MEF catalog based on the contents of ~/bin.
            //
            // Note that any class in the referenced assemblies implementing in "IController"
            // is automatically exported to MEF. There is no need for explicit [Export] attributes
            // on ASP.NET MVC controllers. When implementing multiple constructors ensure that
            // there is one constructor marked with the [ImportingConstructor] attribute.
            var catalog = new AggregateCatalog(
                //new DirectoryCatalog("bin"),
                new DirectoryCatalog("Plugins"),
                new ConventionCatalog(new MvcApplicationRegistry())); // Note: add your own (convention)catalogs here if needed.

            // Tell MVC3 to use MEF as its dependency resolver.
            var dependencyResolver = new CompositionDependencyResolver(catalog);
            DependencyResolver.SetResolver(dependencyResolver);

            // Tell MVC3 to resolve dependencies in controllers
            ControllerBuilder.Current.SetControllerFactory(new MyMEFControllerFactory(dependencyResolver));

            // Tell MVC3 to resolve dependencies in filters
            FilterProviders.Providers.Remove(FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider));
            FilterProviders.Providers.Add(new CompositionFilterAttributeFilterProvider(dependencyResolver));

            // Tell MVC3 to resolve dependencies in model validators
            ModelValidatorProviders.Providers.Remove(ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().Single());
            ModelValidatorProviders.Providers.Add(
                new CompositionDataAnnotationsModelValidatorProvider(dependencyResolver));

            // Tell MVC3 to resolve model binders through MEF. Note that a model binder should be decorated
            // with [ModelBinderExport].
            ModelBinderProviders.BinderProviders.Add(
                new CompositionModelBinderProvider(dependencyResolver));
        }
    }
}

并在我的应用程序类上使用以下代码:

using OMR.Core.Web.Filters;
using OMR.Core.Web.Routing;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace OMR.CMS
{
    public class MvcApplication : System.Web.HttpApplication
    {
        [ImportMany(typeof(IFilterRegistration))]
        public IEnumerable<Lazy<IFilterRegistration>> Filters { get; set; }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            BundleConfig.RegisterBundles(BundleTable.Bundles);

            RegisterFilters();
            RegisterRoutes();
        }

        private void RegisterFilters()
        {
            var filters = GlobalFilters.Filters;
            var filterRegistrations = DependencyResolver.Current.GetServices<IFilterRegistration>();

            foreach (var registar in filterRegistrations)
                registar.Register(filters);
        }

        public void RegisterRoutes()
        {
            var routes = RouteTable.Routes;
            var routeRegistrations = DependencyResolver.Current.GetServices<IRouteRegistration>();

            // Ignores
            foreach (var registrar in routeRegistrations)
                registrar.Ignore(routes);

            // Routes
            foreach (var registrar in routeRegistrations)
                registrar.Route(routes);
        }
    }
}

问题是以下属性在应用程序启动方法上当前为null。

ImportMany(typeof(IFilterRegistration))]
public IEnumerable<Lazy<IFilterRegistration>> Filters { get; set; }

但以下几行正在发挥作用:

var filterRegistrations = DependencyResolver.Current.GetServices<IFilterRegistration>();

为什么我的导入声明不起作用?

0 个答案:

没有答案
相关问题