MVC 使用MEF依赖注入的蛋疼问题

小豪 2014-03-03 11:12:30
最近在用MEF做IOC,遇到两个问题,网上搜不出资料,难道是这个组件都没有人用了?!

1. MVC 自定义Filter,不能注入。
2. 定义了一个父Controller,不能注入。其他controller继承于它。

有解决方案的帮帮忙,谢谢


[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class AdminAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute





public static class MefConfig
{
public static void RegisterMef()
{
var container = ConfigureContainer();

ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory(container));

var dependencyResolver = System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver;
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new MefDependencyResolver(container);
}

private static CompositionContainer ConfigureContainer()
{
var catalog = new AggregateCatalog(new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath));
var container = new CompositionContainer(catalog);

HttpContext.Current.DisposeOnPipelineCompleted(container);
return container;
}
}

public class MefDependencyResolver : IDependencyResolver
{
private readonly CompositionContainer _container;

public MefDependencyResolver(CompositionContainer container)
{
_container = container;
}

public IDependencyScope BeginScope()
{
return this;
}

public object GetService(Type serviceType)
{
var export = _container.GetExports(serviceType, null, null).SingleOrDefault();

return null != export ? export.Value : null;
}

public IEnumerable<object> GetServices(Type serviceType)
{
var exports =_container.GetExports(serviceType, null, null);
var createdObjects = new List<object>();
if (exports.Any())
{
foreach (var export in exports)
{
createdObjects.Add(export.Value);
}
}

return createdObjects;
}

public void Dispose()
{

}
}

public class MefControllerFactory : DefaultControllerFactory
{
private readonly CompositionContainer _compositionContainer;

public MefControllerFactory(CompositionContainer compositionContainer)
{
_compositionContainer = compositionContainer;
}

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
var export = _compositionContainer.GetExports(controllerType, null, null).SingleOrDefault();

IController result;

if (null != export)
{
result = export.Value as IController;
}
else
{
result = base.GetControllerInstance(requestContext, controllerType);
_compositionContainer.ComposeParts(result);
}

return result;
}
}
...全文
672 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lshfong 2014-03-04
  • 打赏
  • 举报
回复
先拦截后再操作
风一样的大叔 2014-03-04
  • 打赏
  • 举报
回复
要注入啥?
Java18 2014-03-03
  • 打赏
  • 举报
回复
帮顶
89蛇 2014-03-03
  • 打赏
  • 举报
回复
小豪 2014-03-03
  • 打赏
  • 举报
回复
顶上

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧