因此,我们让MEF与MVC4一起工作,基于约定的模型又如何呢? [英] So we've got MEF working with MVC4, how about the convention based model?

查看:80
本文介绍了因此,我们让MEF与MVC4一起工作,基于约定的模型又如何呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

经过大量的研究,我发现可以在MVC4中将MEF用于DI,下面的SO链接给出了两个示例:

After much digging about I figured it's possible to use MEF for DI in MVC4, below SO link gives a couple of examples:

如何将MEF与ASP.NET MVC 4和ASP.NET Web API集成

它们工作正常,但是我想知道如何消除像MVC 4应用程序中的控制器那样显式导入"和导出"的需要吗?

They work fine, but I'm wondering how to eliminate the need of explicitly "Import" and "Export" the obvious like your controllers in the MVC 4 app?

网络上有一些建议,一些编程高手的博客也有.但是我在复制他们的成功故事方面几乎没有成功.仅举几例:

There are some suggestions on the web, some top programming minds' blogs. But I had little success in replicating their success stories. Just to name a couple:

  • http://blog.longle.net/2013/05 /17/通常在mvc简化实体图中将带有实体框架的工作单元存储库模式实现为第2部分-mvc-4-di-ioc-with-mef -attributeless-conventions/

    有什么建议吗?

    推荐答案

    好,我现在有解决方案.

    Ok, I have a solution now.

    MEFcontrib为基于约定的模型提供了良好的支持.因此,只需将NuGet(安装包mefcontrib)下载到您的mvc 4项目中即可.

    The MEFcontrib offers good support for the convention based model. So simply NuGet it(install-package mefcontrib) to your mvc 4 project.

    一旦有了mefcontrib二进制文件,您只需要首先注册约定,然后通过添加约定目录来利用它即可.下面的代码段显示了如何:

    Once you have the mefcontrib binaries, you just need to register the conventions first and then harness it by adding the convention catalogue. Below snippet shows how:

    公约注册:

    public class InitPartsConvention : PartRegistry
    {
        public InitPartsConvention()
        {
            Scan(x => x.Assembly(Assembly.GetExecutingAssembly()));
    
            Part()
                .ForTypesAssignableFrom<IHttpController>()
                .MakeNonShared()
                .Export()
                .Imports(x =>
                {
                    x.Import().Members(
                        m => new[] {
                                     m.GetConstructors()
                                     .FirstOrDefault(
                                        c => c.GetCustomAttributes(typeof(ImportingConstructorAttribute), false).Length > 0) 
                                        ?? m.GetGreediestConstructor()
                                 });
    
                    x.Import().Members(
                        m => m.GetMembers(BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic)
                            .Where(
                            mbr => mbr.GetCustomAttributes(typeof(ImportAttribute), false).Length > 0).ToArray()
                            );
                });
    
            Part()
                .ForTypesAssignableFrom<IController>()
                .MakeNonShared()
                .Export()
                .Imports(x =>
                {
                    x.Import().Members(
                        m => new[] {
                                     m.GetConstructors()
                                     .FirstOrDefault(
                                        c => c.GetCustomAttributes(typeof(ImportingConstructorAttribute), false).Length > 0) 
                                        ?? m.GetGreediestConstructor()
                                 });
    
                    x.Import().Members(
                        m => m.GetMembers(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(
                            mbr => mbr.GetCustomAttributes(typeof(ImportAttribute), false).Length > 0).ToArray()
                            );
                });
        }
    }
    

    这将注册您的api控制器和mvc控制器,以便可以对其进行MEFified.但是,它不涵盖AsyncController.

    This registers your api controllers and mvc controller so that they can be MEFified. It does not cover the AsyncController however.

    MEF MVC引导程序

    public static class MefBootstrapper
    {
        public static void RegisterMef()
        {
            var container = GetContainer();
            var resolver = new MefDependencyResolver(container);
            // Install MEF dependency resolver for MVC
            DependencyResolver.SetResolver(resolver);
    
            // Install MEF dependency resolver for Web API
            System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver 
                = resolver;
        }
    
        private static CompositionContainer GetContainer()
        {
            var path = HostingEnvironment.MapPath("~/bin");
            if (path == null) throw new Exception("Unable to find the path");
    
            var catelog = new AggregateCatalog(
                new DirectoryCatalog(path),
                new ConventionCatalog(new InitPartsConvention()));  // this adds the convention to MEF
            return new CompositionContainer(catelog);
        }
    }
    

    就这样,工作完成了!在您的MVC 4应用程序中享受动态DI.

    That's it, job done! Enjoy dynamic DI in your MVC 4 apps.

    这篇关于因此,我们让MEF与MVC4一起工作,基于约定的模型又如何呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆