Asp.net mvc 4 所以我们';我们让MEF与MVC4合作,那么基于约定的模型呢?
在深入研究之后,我认为可以在MVC4中为DI使用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
有什么建议吗?与.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);
}
}