【问题标题】:What is the best alternative to the ASP.NET Provider Model if using IOC also?如果还使用 IOC,那么 ASP.NET 提供程序模型的最佳替代方案是什么?
【发布时间】:2012-01-19 06:54:29
【问题描述】:

ASP.NET 提供程序模型是一项伟大的技术,可以解决允许某人将某些功能的单独实现“插入”到 Web 应用程序中的问题。 Provider 模型在实现需要配置时通常有点痛苦,因此它的使用最少。

IOC 是确保在应用程序的每个级别分离关注点的好方法,因此广泛使用它来支持所有组件的单元测试是很好的。

如果 Web 应用程序正在使用 IOC 容器,那么使用 Provider 模型似乎也是错误的,因为您似乎在抽象出已经抽象出来的东西,从而产生了两个级别的复杂性(可能除了现有的提供者 - 我我正在谈论制作自定义提供程序)。

(在我的博文中查看更多信息:http://healthedev.blogspot.com/2011/12/making-custom-built-applications.html

我正在为 IOC 使用 AutoFac,并且可以允许“配置覆盖”,因此这似乎是满足 Provider 模型给我的相同解决方案的一个很好的选择,但是我不太了解 MEF 如何满足这个要求还是我缺少其他东西?

如果您可以从头开始设计 ASP.NET MVC Web 应用程序,并且要求您必须转售打包版本,以便其他人可以“插入”某些数据访问,而无需重新编译,您将如何实施?

【问题讨论】:

    标签: asp.net-mvc inversion-of-control mef autofac provider-model


    【解决方案1】:

    统一和结构图也。提供装配扫描。 Unity 需要一个 auto.registration 模块来执行此操作。

    【讨论】:

    • 对不起,我以为这是一条评论,当我开始工作时会移动它,而不是遭受香肠手指的折磨
    【解决方案2】:

    我认为这取决于可插拔组件是什么。

    有些东西必须是提供者。例如,如果您使用来自标准 ASP.NET 成员资格提供程序的功能,则必须从中派生您的功能。在这些情况下,我发现编写一种“代理”提供程序来解决依赖关系并将调用传递给使用 DI 注册的实现很容易。

    例如,假设您已将 Autofac 连接到 MVC DependencyResolver,您可能会在您的成员资格提供程序中看到如下内容:

    public override bool ChangePassword(
      string username,
      string oldPassword,
      string newPassword)
    {
      var provider = DependencyResolver.Current.GetService<IMembershipService>();
      return provider.ChangePassword(username, oldPassword, newPassword);
    }
    

    我还没有找到任何可以让您解耦内置提供程序的自动功能。

    对于不是提供者的东西,只需照常使用 IoC 功能即可。我更喜欢使用 Autofac 的 assembly scanning functionalitymodules 的无配置 IoC,这将允许您基本上将带有覆盖的程序集放入 bin 文件夹并重新启动应用程序。在启动时扫描任何模块并注册它们。如果您想比这更明确,您可以创建自己的启动界面,例如...

    public interface IMyStartup
    {
      void Start(ContainerBuilder builder);
    }
    

    ...然后仅扫描您的特定界面并在其上调用 start 方法。有很多方法可以做到这一点(属性、类型、特定已知位置的程序集等),但都归结为程序集扫描。

    【讨论】:

    • 谢谢伙计,我认为使用 AutoFac 进行装配扫描看起来是最好的方法!我现在不能投票,因为我没有足够的代表,但当我得到足够的代表时,我会回来投票!
    • 您可能无法投票,但您应该能够接受答案 - 无需代表。如果您认为这是正确的答案,请这样做。
    • 我现在有足够的积分 - 我已经投票并标记为答案,抱歉耽搁了。
    猜你喜欢
    • 1970-01-01
    • 2017-06-11
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2011-01-18
    • 2011-05-28
    相关资源
    最近更新 更多