0

我在使用 ASP.NET 和 Unity 时遇到了问题。今天,需要经过身份验证的用户的控制器的构造函数有一些参数,只有在调用用户经过身份验证时才能由 Unity 填充。如果我调用导致此类控制器未验证的 URL,则 ASP.NET MVC 管道会尝试创建控制器,并且 Unit 会抛出异常,因为容器中不存在所需的对象。对于身份验证,我使用 WSFederationAuthenticationModule 和 SessionAuthenticationModule,在 web.config 中,我将“Forms”配置为身份验证模式,以强制 ASP.NET 重定向到登录页面。如果用户未经身份验证但直接重定向到登录页面,我预计管道不会创建控制器实例。

4

1 回答 1

0

需要经过身份验证的用户的控制器的构造函数有一些参数,如果调用用户经过身份验证,这些参数只能由 Unity 填充

这就是你问题的根源。这意味着该服务的构造函数做得太多。构造函数不应该做的不仅仅是存储传入的依赖项。通过这种方式,您可以放心地组合对象图

对象图的构建通常应该是静态的。这意味着解析的对象图不应该根据运行时条件而改变(有例外,但这是一个很好的经验法则)。不管用户是否被授权,服务类仍然应该被组合和注入。这意味着数据的授权和加载是在稍后的时间点完成的;请求实际执行的那一刻(即在对象图组成之后)。

因此,不要在构造函数中执行此工作,而是将此工作移至执行操作方法的那一刻。您可以将此逻辑移至执行身份验证的服务,使用过滤器属性或使用装饰器实现此功能。

于 2014-02-17T10:43:39.877 回答