Castle.Windsor,ASP.NET MVC,处理注入的空分辨率

时间:2011-02-07 14:06:32

标签: asp.net-mvc-3 castle-windsor

Castle.Windsor(3.0)中使用ASP.NET MVC是否有任何方法可以在我的某个依赖项解析为null时进行适当处理?例如,假设我有IMembershipService

class ServiceInstaller
{
 // ... 
 void Install( // .. )
 { 
  container.Register(
  Component
  .For<IMembershipService>()
  .ImplementedBy<MembershipService>()
  .LifeStyle.PerWebRequest
  );
 }
}

好的,这很有效。现在,也许并非我的所有站点都需要用户登录。让我们假设我的Web主机的数据库服务器可能会崩溃几个小时。在那种情况下,查看数据库或试图调用ISession的内容可能会返回null。

在这种情况下我该怎么办?我可以写if(membershipService == null)一百遍,但这看起来很愚蠢。是否有内置的解决方案来说明“嘿,如果我们有错误,请这样做吗?”

2 个答案:

答案 0 :(得分:4)

我认为该服务永远不应为null。如果数据库关闭,那么应该返回服务,但是它的方法应该抛出异常,返回null或一些默认值,具体取决于服务的语义。

答案 1 :(得分:0)

Ciel,i had this problem just recently并在寻找答案时找到了您的问题。

基本上,您应该使用类型化工厂在包装组件中的运行时解析组件。如果没有关于你正在寻找的组件的匹配,工厂应该返回一个默认对象,默认对象将实现所需的任何行为。

对于IMembershipService,实现继承接口的NotCheckingMembershipService类,不执行任何操作,并使其成为不需要它的组件的默认值。更具体的会员服务可以链接到特定的控制器。

为此,您必须创建一个通用的“全能”实现

public class NotCheckingMembershipService<T>: IMembershipService<T> where T: Controller
{
}

并将其注册为开放IMembershipService

的默认组件
_container.Register(
            Component.For(typeof(IMembershipService<>))
            .ImplementedBy(typeof(NotCheckingMembershipService<>))
            .IsDefault());

然后只需在需要时注册您的自定义会员服务。分辨率不会失败,您将始终可以调用界面。