这些课程/方法应该去哪里?

时间:2011-01-24 04:37:17

标签: c# asp.net-mvc asp.net-mvc-3 service-layer

我有这样的结构

WebUI项目 - 控制器,视图 框架项目 - 存储库,服务层和域

所以现在我有3个方法/类

  1. Open Id / Open auth
  2. 起初我以为我会将所有逻辑放在我的框架项目的服务层中(准备请求,检查响应等等)。

    所以现在我正在使用dotnetopenauth库,因为我需要在我的控制器中使用AsActionResult方法(我从服务层返回“OutgoingWebResponse”,因为我不希望服务层中有任何MVC)

    当我决定在我的服务层中没有任何MVC时,它让我思考。正如我所读到的那样,包含业务逻辑的服务层不应该具有任何依赖性,例如MVC引用,因为如果你转到windows phone应用程序,你就不应该使用MVC。

    您的业务层应该可以插入任何应用程序。

    所以现在我不确定是否应该将我为openId编写的内容移动到我的mvc project中的models文件夹中,原因如上。因为如果我去windows操作应用程序或表单应用程序,我将不会使用dotnetopenauth,因为我不认为这些类型的应用程序支持它。

    1. 我的第二个是表单身份验证。再次与上述原因相同。这应该在我的模型文件夹中作为本地服务/ repo层(即在同一个项目文件中)。

    2. 我正在使用nhibernate,流利的nhiberate和ninject。我的回购都在我的框架项目中。所以我当然有所有的参考资料。但是因为我在ioc中使用ninject,所以我的webui项目中也有所有引用。

    3. 我不知道是否可以更改这个以从我的webui中删除这些引用。我在想不,因为我不能在我认为应该去的网站上拥有我的ioc。

1 个答案:

答案 0 :(得分:0)

作为一般经验法则,您不应针对不存在的要求编写代码(将应用程序移植到Windows手机)。

通常情况下,您会在服务层中抽象出来,但OAuth或Facebook集成会产生问题,因为它依赖于http并且能够访问身份验证网站。

您将遇到的问题是因为“all abstractions are leaky”,无论您在何处放置,服务层都会以某种方式损坏您的服务层。有关用户注册和登录的详细信息(例如他们的openid url)将最终出现在您的数据库中。你的服务/ repo / db / model / mvc / viewmodel / controllers类都会因为它的性质而知道什么是openauth。

好消息是这些基于浏览器的身份验证策略可以存在于Windows窗体,WPF或Silverlight应用程序中。您只需在应用程序内打开浏览器,而不是使用MVC本机重定向。

所以我建议将dotnetopen auth注册码放在服务层内,实际上抽象出重定向和回调过程是如何发生的。

类似的东西:

public interface IOpenAuthRedirect
{
      public void Redirect( url )
      public void ParseCallback( url )
}


public class MVCOpenAuthRedirect
{
     public void Redirect(url)
     {
        HttpContext.Current.Response.Redirect(url);
     }
}

public class SilverlightOpenAuthRedirect
{
    public void RedirectUrl( url )
    {
        SomeBrowserControl.IForgetTheCallToRedirect( url );
    }   

}

现在,不同的实现细节非常灵活,除了MVC之外,您还可以轻松转换到另一个平台。