0

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

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

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

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

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

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

4

2 回答 2

1

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

有些东西必须是提供者。例如,如果您使用来自标准 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 的程序集扫描功能模块的无配置 IoC ,这将允许您基本上将带有覆盖的程序集放入 bin 文件夹并重新启动应用程序。在启动时扫描任何模块并注册它们。如果您想比这更明确,您可以创建自己的启动界面,例如...

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

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

于 2011-12-13T17:31:08.307 回答
0

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

于 2013-02-13T08:18:57.220 回答