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

小豪 小豪 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在用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;
}
}
...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
小豪
.NET社区 62,271 成员 668,968 内容