ASP的最佳替代方案是什么?. NET提供程序模型(如果使用IOC的话)



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

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

如果一个web应用程序正在使用IOC容器,使用提供者模型似乎也是错误的,因为你似乎是抽象出一些已经抽象出来的东西,创建两个层次的复杂性(除了可能现有的提供者-我正在谈论自定义提供者)。

(详见我的博客:http://healthedev.blogspot.com/2011/12/making-custom-built-applications.html)

我正在使用AutoFac进行IOC,并且有可能允许"配置覆盖",因此这似乎是一个很好的替代方案,以满足提供者模型给我的相同解决方案,但是我不知道很多关于MEF如何满足这一要求,或者是否有其他东西在那里我错过了?

如果你能设计一个ASP。NET MVC web应用程序,并且要求你必须出售打包版本,以便其他人可以"插入"某些数据访问而无需重新编译,你将如何实现它?

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

有些东西必须是提供者。例如,如果您使用的是标准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功能。有很多方法可以做到这一点(属性,类型,特定已知位置的程序集等),但这一切都归结为程序集扫描。

统一和结构映射也。提供装配扫描。Unity需要一辆汽车。注册模块来完成此操作。

相关内容

最新更新