4

我有这种情况,用户没有登录的事实阻止了我的控制器的依赖关系的构建。如何解决应用了Authorize属性的MVC控制器的鸡蛋依赖解决方案?

[Authorize] 
class MyController : Controller 
{ 
    public MyController(MyService service) 
    { 
    } 
} 

class MyService 
{ 
    public MyService() 
    { 
     // requires information which only 
     // becomes known after the user logs in 
    } 
} 

我的问题是:我可以做一些事来引起MVC框架第一看看授权属性和然后解决控制器实例?

上面会更理想对我来说比下面的任一:

  • 更改为MyService到能够处理用户登录之前创建的
  • 与注射Func键
  • 切换到服务点

理想情况下,我想翻转MVC框架中的一个开关,它说:“在解析控制器之前,检查你是否真的要使用它而不是t oss骨粉出来,由于缺乏授权和指导反正...”

+0

您在哪里/如何注入服务? –

+0

您可以查看Mark Seeman关于实现抽象工厂的文章:http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/它涵盖了这种需求。只要工厂在注射根部定义,它不是真正的服务定位器。 –

+0

你可以指定你的依赖为懒吗?例如,autofac让你注入懒惰。不知道有关统一 – ChaseMedallion

回答

4

我有这种情况的事实,即用户没有登录阻止我的控制器的依赖关系的建设。

这就是问题的根源。

//需要只成为

用户登录后知信息。这意味着该服务的构造函数太多。构造器不应该仅仅存储传入的依赖关系。这样你可以compose object graphs with confidence

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

+1

+1非常好的答案。 –

+1

谢谢,这是很好的建议,并以这种方式思考可能会导致我的情况得到解决。如果没有人能够直接回答我的问题的具体工作,我肯定会回来并标记出答案。 –

+1

@AaronAnodide无需等待任何解决方法。只需通过将计算移至后期来解决问题。我们已经多次遭遇同样的问题,现在已经进行了测试,以阻止开发者再次遇到这个问题。 – trailmax

1

你的问题是你并不真正了解MVC请求管道是如何工作的。

您必须认识到的第一件事是,本质上,属性设计为与控制器基类中的相同事件相匹配。 Controller中有一个OnAuthorization方法,它在调用属性OnAuthorization方法之前或之后被调用。

因此,为了在大致相同的时间调用两种方法,这意味着Controller类必须已经构建完成。更重要的是,在授权过滤器之前还有许多其他内容,例如模型绑定,因为您的授权过滤器可能需要来自模型的信息来做出决定。

我建议你看看这个Pipline图表。

https://www.simple-talk.com/dotnet/.net-framework/an-introduction-to-asp.net-mvc-extensibility/