Asp.net mvc 4 所以我们';我们让MEF与MVC4合作,那么基于约定的模型呢?

Asp.net mvc 4 所以我们';我们让MEF与MVC4合作,那么基于约定的模型呢?,asp.net-mvc-4,mef,Asp.net Mvc 4,Mef,在深入研究之后,我认为可以在MVC4中为DI使用MEF,下面的链接给出了几个示例: 它们工作得很好,但我想知道如何消除显式“导入”和“导出”的需要,就像MVC4应用程序中的控制器一样 在网络上有一些建议,一些顶尖编程头脑的博客。但我在复制他们的成功故事方面几乎没有成功。举几个例子: 有什么建议吗?与.NET 4.0一起提供的版本没有内置的方法来实现这一点。我认为MEF2支持4.5版本,它还有更多的选择,包括。可能有一个版本可以在NuGet上下载并与.NET4.0一起使用 Microso

在深入研究之后,我认为可以在MVC4中为DI使用MEF,下面的链接给出了几个示例:

它们工作得很好,但我想知道如何消除显式“导入”和“导出”的需要,就像MVC4应用程序中的控制器一样

在网络上有一些建议,一些顶尖编程头脑的博客。但我在复制他们的成功故事方面几乎没有成功。举几个例子:


有什么建议吗?

与.NET 4.0一起提供的版本没有内置的方法来实现这一点。我认为MEF2支持4.5版本,它还有更多的选择,包括。可能有一个版本可以在NuGet上下载并与.NET4.0一起使用


Microsofts的开放源码库的持续开发和预发布非常好,但有时很难确定每个版本中有哪些功能,以及哪些版本将其纳入了哪个框架中。我真的找不到一个明确的答案……

好的,我现在有了一个解决方案

MEFcontrib为基于约定的模型提供了良好的支持。因此,只需将它安装到MVC4项目中即可

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

大会注册:

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

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

好吧,这当然是一个选项,尽管不是我想要的。但是Thank.throws“类型MEF.MVC4.MefDependencyResolver似乎没有实现Microsoft.Practices.ServiceLocation.IServiceLocator。参数名称:commonServiceLocator”您可以
安装程序包MefContrib.MVC3
,并免费注册。加上一个新属性,
PartCreationScope
。很方便。
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);
    }
}