MEF 和 ASP.NET MVC

2024-01-02

我想将 MEF 与 asp.net mvc 一起使用。 我写了以下控制器工厂:

public class MefControllerFactory : DefaultControllerFactory
{
    private CompositionContainer _Container;

    public MefControllerFactory(Assembly assembly)
    {
        _Container = new CompositionContainer(new AssemblyCatalog(assembly));
    }



    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType != null)
        {
            var controllers = _Container.GetExports<IController>();

            var controllerExport = controllers.Where(x => x.Value.GetType() == controllerType).FirstOrDefault();

            if (controllerExport == null)
            {
                return base.GetControllerInstance(requestContext, controllerType);
            }

            return controllerExport.Value;
        }
        else
        {
            throw new HttpException((Int32)HttpStatusCode.NotFound,
                String.Format(
                    "The controller for path '{0}' could not be found or it does not implement IController.",
                    requestContext.HttpContext.Request.Path
                )
            );
        }
    }
}

在 Global.asax.cs 中,我正在设置我的控制器工厂:

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory.MefControllerFactory(Assembly.GetExecutingAssembly()));
    }

我有一个区域:

[Export(typeof(IController))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller
{
    private readonly IArticleService _articleService;

    [ImportingConstructor]
    public HomeController(IArticleService articleService)
    {
        _articleService = articleService;
    }

    //
    // GET: /Articles/Home/

    public ActionResult Index()
    {
        Article article = _articleService.GetById(55);

        return View(article);
    }

}

IArticleService是一个接口。

有一个类实现IArticleService并导出它。

有用。

这就是我使用 MEF 所需的一切吗?

如何跳过设置PartCreationPolicy and ImportingConstructor对于控制器?

我想使用构造函数设置我的依赖项。

When PartCreationPolicy丢失,我得到以下异常:

控制器“MvcApplication4.Areas.Articles.Controllers.HomeController”的单个实例不能用于处理多个请求。如果正在使用自定义控制器工厂,请确保它为每个请求创建一个新的控制器实例。


你的技术非常可靠,即使在部分信任的情况下也能发挥作用。这书呆子晚餐MEF http://www.hanselman.com/blog/ExtendingNerdDinnerAddingMEFAndPluginsToASPNETMVC.aspx示例的扩展允许您按照约定处理发现控制器并自动将它们放入 MEF 导出中,而无需使用 MEF 属性标记它们。但是直接管理零件目录在部分信任中不起作用,因此书呆子晚餐 MEF 技术在部分信任中不起作用。

如果您完全信任地工作,并且希望控制器进行基于约定的发现,请从 Nerddinner MEF 示例开始,但您可能还应该阅读 nerddinner MEF 示例的几个主要问题,如果您自己的应用程序模型会出现这些问题是一个单独的类库项目。我关于这些案例的博客 http://reddnet.net/post/2010/06/22/Hooked-on-MEF-Using-MEF-in-ASPNET-MVC-and-the-Nerd-Dinner-MEF-sample-fix.aspx并提出了一些修复建议。

如果您对基于惯例的发现内容不太感兴趣,那么书呆子晚餐样本就有点过度设计了。您的解决方案可能就这样......并且也可以在部分信任的情况下工作,这始终是一个好处。

[update]我确实发现了你的技术的一个潜在问题:

var controllerExport = controllers.Where(x => x.Value.GetType() == 
controllerType).FirstOrDefault();

在此处的 where 子句中,您在部件集合中的每个导出上调用 .Value...这实际上会导致每个导出被组合并实例化以便进行评估。这可能是一个令人讨厌的性能问题。

您可以考虑使用命名导出合约来装饰您的控制器,如下所示:

[Export("Home", typeof(IController))]

然后使用像这样的控制器工厂:

public class MefControllerFactory: IControllerFactory
{
    private CompositionContainer _Container;

    public MefControllerFactory(Assembly assembly)
    {
        _Container = new CompositionContainer(new AssemblyCatalog(assembly));
    }

    #region IControllerFactory Members

    public IController CreateController(RequestContext requestContext, string controllerName)
    {

        var controller = _Container.GetExportedValue<IController>(controllerName);

        if (controller == null)
        {
            throw new HttpException(404, "Not found");
        }

        return controller;
    }

    public void ReleaseController(IController controller)
    {
       // nothing to do
    }

    #endregion
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MEF 和 ASP.NET MVC 的相关文章

  • 是否可以在 ASP.NET Web API 和 SPA 中使用基于 cookie 的身份验证?

    我想创建基于 angularjs 前端和 ASP NET Web API 的 Web 应用程序 我需要创建安全 api 但我无法在将实施此 Web 应用程序的公司服务器上使用基于令牌的身份验证 是否可以对 SPA 和 ASP NET Web
  • 禁用 ASP.net 文本框而不实际禁用它?

    在我的 ASP Net 应用程序中 有一个文本框可以从CalendarExtender 填充文本框后 它会将该日期与表单上的另一个日期进行检查并显示modalpopupextender如果日期错误 则会弹出窗口 但是 我不想允许用户输入此文
  • 在asp net mvc中简单的图像上传

    我正在构建一个简单的学校门户 我一直坚持将图像上传到我的应用程序中 即用户应该将学校图像上传到我的服务器 我的图像目录为 Content Images 所有上传图像都应该上传到这个目录 我有以下代码 input type file id S
  • orchard cms路由问题

    我创建了一些自定义内容类型 其中包括路线部分 以便我的内容管理员可以编辑项目的别名 我没有运气配置一条路线 使我自己的控制器能够为这些项目的请求提供服务 核心 Routable 模块中到 ItemController 的路径的路由优先级为
  • 自定义WebApi授权数据库调用

    我正在尝试确定我编写的自定义授权属性是否确实是一个好主意 Scenario假设我们有一系列商店 每个商店Store有一个主人 只有商店的所有者才能对商店进行CRUD操作 除了具有Claim这基本上超越了所有权要求 并表示他们可以在任何商店上
  • 将 url 参数获取到 asp.net 标签中

    我试图自动将 asp label 的文本设置为 url 参数 但它似乎不起作用 这是我的代码
  • 即使通过 ssl,在 ViewState 中存储信用卡和定价信息是否安全?

    我有一个带有私有属性的页面 该页面在视图状态中存储信用卡对象和购物车对象 以便我可以在回发期间维护对它们的引用 顺便说一句 涉及的页面将使用 SSL 这安全吗 我不会在视图状态中存储敏感信息 ever 通过这样做 您将安全性委托给浏览器的实
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • ChannelFactory重用策略

    我一直在读到 ChannelFactory 的创建是昂贵的 除非有技术原因不这样做 否则应该在可能的情况下重用 ChannelFactory 或者通过某种方式缓存它们 或者使用工厂的静态实例 根据您的经验 您发现哪些 ChannelFact
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • 向特定客户端发送消息以及消息发送用户

    我是 SignalR 的初学者 我创建了一个基于 SignalR 的基本聊天应用程序 我面临的问题是我想向特定客户端以及发送消息的用户发送消息 这个怎么做 我知道要向特定客户端发送消息 我们可以这样做 Clients Client Cont
  • Visual Studio IIS 工作正常,但在 IIS 7 脚本中托管时获取错误的 URL?

    Hi 我有一个 ASP NET MVC 站点 我在 MasterPage 中使用以下链接
  • 我应该对 ObjectContext 使用 using 关键字吗?

    我在这个网站或 CodeProject 的某个地方读到 好的规则是 如果某个类已经实现了 IDisposable 接口 那么您应该使用 using 关键字 因为使用翻译成 MSIL 的关键字会尝试 最终阻止如下内容 try some log
  • 起订量:无法投射到接口

    今天早些时候我问过这个question https stackoverflow com questions 2774785 moq unable to cast 因此 由于起订量从接口创建它自己的类 我无法将其转换为不同的类 所以这让我想知
  • 如何在 MVC3 Razor 视图中呈现数据表

    我在 xls 电子表格 1 之间有一个可靠且经过测试的导入方法 该方法返回DataTable 我已将其定位在我的服务层中 而不是数据中 因为只有工作簿作为上传文件保存 但现在我想知道在哪里以及如何生成此内容的 HTML 表示形式DataTa
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • 为什么 appcmd.exe 解锁配置在 Azure 模拟器上不起作用?

    我最近升级到 Azure 2 1 SDK 现在我的部分功能遇到了问题web config在计算模拟器上运行时处于 Web 角色中 我的web config包含这个
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默

随机推荐

  • Facebook 登录后 URL 中的尾随字符

    我正在通过 facebook 身份验证过程将我的用户登录到我的网站 用户登录后 我使用以下命令重定向到个人资料页面 resp sendRedirect l profile 但是当我进入个人资料页面时 URL 就结束了 profile 这似乎
  • 使用静态方法与实例化包含该方法的类的性能

    我正在开发一个 C 项目 以前的程序员不知道面向对象编程 因此大部分代码都在巨大的文件中 我们谈论的是大约 4 5000 行 分布在数十个甚至数百个方法中 但只有一个类 重构这样一个项目是一项艰巨的任务 所以我现在已经半学会了忍受它 每当在
  • angular2 rc4“XHR错误(404未找到)加载/traceur

    我将 angular2 从 RC2 迁移到 RC4 现在收到以下错误 localhost 36 Error Error XHR error 404 Not Found loading http localhost 3000 traceur
  • 隐藏 SEO 黑名单 [已关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在使用回发对大量数据执行分页 由于我没有可供谷歌阅读的站点地图 因此谷歌永远不会知道某些产品 因为谷歌不会按任何按钮 如果用户代理是搜索引擎的用户
  • excepts.TypeError: src 不是 numpy 数组,也不是标量

    import cv2 import numpy as np def imageMoments img Single channel 8 bit or floating point 2D array read original cv2 imr
  • 调度操作以响应取消

    我从取消食谱 https redux observable js org docs recipes Cancellation html来自 redux observable 文档并希望对其进行一些扩展 基本上我有一个场景 在触发取消后 使用
  • 从unix文件中获取日期

    我想从 txt 文件中获取日期 如下所示 933 Mahinda Perera male 1989 12 03 2010 03 17T13 32 10 447 0000 192 248 2 123 Firefox 1129 Carmen L
  • 迭代计算不同长度

    我有一个 n 2 df 第一列是起始月份 第二列是每月回报 下面的示例 使用动物园包 日期以年月形式显示 我想计算从每个起始月份回报开始的 1 到 12 个月的回报 并使用它们创建一个 n 13 数据框 复合回报构成最后 12 列 第 2
  • 如何在 adb shell am start 的 URL 中包含 & 符号?

    Using adb shell am start some url 我可以使用活动管理器启动 URL 但是 如果我包含多个 URL 参数 则除第一个参数之外的所有参数都会被删除 Example adb shell am start http
  • 使用 Express 4.0 上传文件:req.files 未定义

    我试图获得一个与 Express 4 0 一起使用的简单文件上传机制 但我不断得到undefined for req files in the app post身体 这是相关代码 var bodyParser require body pa
  • Swift Xcode 索引冻结或缓慢

    也许这只是我经历的一个恼人的 功能 从 Xcode 6 0 1 升级到 Xcode 6 1 后 情况发生了变化 Xcode 6 1 永远索引项目或编译源文件 该工程规模并不大 它只包含工作区中的一堆 Swift 文件和 AWS SDK 2
  • 用美元符号替换 javascript regexp 匹配组

    这个应该很简单 让我们看一下字符串 str 1 99 or 4 89 我想在金额前面添加一个美元符号 我试过 str replace d d d g 1 它给了我 1 或 1 所以我坚持做 str replace d d d g 1 rep
  • spring中没有默认构造函数的类的bean类实例化

    我在模型中使用第三方库类 XYZ 作为参数 XYZ 没有默认构造函数 所以 spring 无法为其创建 bean 给出错误消息 org springframework web util NestedServletException Requ
  • 在满足特定条件之前“阻止”的最佳方法

    我想创建一些以通用方式使用的方法 它会阻塞 除非某个超时到期 直到满足给定条件 代码中的用法类似于 WaitUntil condition 我尝试使用 While 循环来实现它 但这似乎是一种浪费 在当前的实现中 我正在初始化一个 一次性
  • 在 ios swift 中实施 Google Analytics

    我正在遵循 Analytics for iOS developers google com analytics devguides collection ios v3 ver swift 指南 但我的 Swift 代码项目中出现了无法修复的
  • 使用 imap 和 php 检索最近 3 封电子邮件

    我试图弄清楚如何使用 imap 和 php 获取最新的 3 封电子邮件 已看到和未看到 由于邮箱内有 1 000 封电子邮件 因此需要节约资源 我认为获取所有标头可能需要太多资源 我只需要发件人 主题和日期 任何想法 感谢您的任何建议 帮助
  • iPhone 上的日期字符串中的毫秒数应使用什么格式字符串?

    我需要解析包含毫秒的格式的字符串 我应该使用什么格式字符串来获取正确的日期值 例如 假设我有一个具有以下值的字符串 2011 06 23T13 13 00 000 在以下代码中我应将什么格式字符串传递给 NSDateFormatter NS
  • VB.NET 中标识符两边的方括号代表什么?

    一般来说 我对 VB 和 NET 非常熟悉 但我刚刚遇到了这段代码 Me GetType 周围括号的用途是什么GetType 方括号用于告诉编译器应该将其解释为类型 即使它是关键字 但你的例子应该是一样的Me GetType 例如 您可以将
  • 良好的 DRY 方法来渲染和 AJAX 更新页面

    想象一下一个评论网站 用户可以在其中输入评级和可选的简短评论 在每个评论页面上 您都会收到许多评论 这些评论显示在页面末尾的表格中 顺便说一句 不寻找数据网格类型控件 太简单了 我想让用户输入新评论并更新页面而无需刷新页面 到目前为止都是简
  • MEF 和 ASP.NET MVC

    我想将 MEF 与 asp net mvc 一起使用 我写了以下控制器工厂 public class MefControllerFactory DefaultControllerFactory private CompositionCont