1

我一直在谷歌搜索幾個小時,找不到與我所需要的完全相關的文章。體系結構和Microsoft.AspNet.Providers

我有一個MVC4網站具有以下層:

  • 表示層(MVC4)
  • 業務層
  • 數據層

我想用下面的供應商:(使用NuGet安裝) 安裝包Microsoft.AspNet.Providers

我的問題更多的是建築設計。

在我看來,我應該在我的數據層安裝這個(Microsoft.AspNet.Providers),因爲它是與成員資格數據庫交談的代碼。

但是,即使是Hanselman,我也可以找到所有帖子,只是將它安裝在Presentation層/ MVC4中。

我在分離問題上非常大,在整個應用程序中使用依賴注入。

很明顯,我需要在我的web.config提供商的配置,但希望我的數據層中的所有成員代碼。

有什麼想法?

感謝 拉斯

PS。很想知道使用nuget將其安裝在數據/存儲庫層中的過程。對於Nuget安裝的DLL有些困惑。如果我安裝在我的數據層,nuget不更新MVC web.config。

+0

什麼是「MVC層?」 MVC中的M代表模型;它*是你的數據層。我認爲你的會員代碼應該在一個Repository對象中。 – 2012-08-07 22:42:00

+0

@RobertHarvey,模型不是「數據層」,而是「業務邏輯層」。魔鬼是在細節= P – 2012-08-07 22:47:10

+0

@tereško:如你所願,但我不把我的商業邏輯放在模型中。它要麼在存儲庫中,要麼在其自己的層中。從技術上講,我想這就是模型的所有部分。 – 2012-08-07 22:48:26

回答

1

實際上答案很簡單:您應該隱藏提供程序在您業務層中定義的抽象之後。通過這種方式,你可以編寫一個適配器,它實現了這個抽象環繞提供者,你可以使用依賴注入將此適配器注入 。這樣你只需要從你的MVC4項目中引用Microsoft.AspNet.Providers,並防止任何代碼直接引用AspNet.Providers,這可以讓你稍後更容易切換。

例子:

// Define in business layer 
public interface IAuthorizationService 
{ 
    bool bool IsCurrentUserInRole(string role); 
} 

public class SomeBusinessLayerCommand 
{ 
    private IAuthorizationService authorizer; 

    public SomeBusinessLayerCommand(
     IAuthorizationService authorizer) 
    { 
     this.authorizer = authorizer; 
    } 

    public void SomeOperation() 
    { 
     if (this.authorizer.UserIsInRole("Admins")) 
     { 
      // some secret admin stuf 
     } 
     else 
     { 
      // some normal user stuf 
     } 
    } 
} 

而在表示層,你可以定義一個適配器:

public class MembershipAdapter : IAuthorizationService 
{ 
    public bool IsCurrentUserInRole(string role) 
    { 
     return Roles.IsUserInRole(role); 
    } 
} 

而且你可以用你喜歡的DI容器映射IAuthorizationServiceMembershipAdapter

+0

謝謝@Steven,欣賞這一點。當我喜歡回到這個時間的時候,我會嘗試一下。 – RuSs 2012-08-26 22:10:50