2012-01-14 17 views
3

我知道你可以通過使用User.Identity.Name從控制器中獲取當前登錄用戶的用戶名。然而,我的解決方案是在4層(4個項目)拆分:ASP.Net MVC 3 - 從存儲庫中獲取登錄用戶名的最佳方式是什麼?

  1. MyProject.Domain爲模特
  2. MyProject.Data的倉庫
  3. MyProject.Services這裏的生意邏輯是
  4. MyProject的.Web爲控制器,ViewModels和視圖

現在,我的問題是什麼是從存儲庫中獲取當前用戶的用戶名的最佳方式。

問題是我所有的模型都有4個審計屬性:CreatedBy,CreatedDate,ModifiedBy,ModifiedDate。我想知道如何在模型存儲到數據庫時填充CreatedBy和ModifiedBy屬性。

UPDATE

這裏是我做以下下面我得到了建議。我在我的域中添加了一個IUser接口。我不確定這是否是最好的地方添加這個,但我決定把它放在那裏,因爲我的域被所有其他層引用。我還爲我的控制器層(MyProject.Web)添加了一個User類,因爲此類需要訪問HttpContext,並且這是可訪問的層。說實話,我不知道應該在這一層添加這樣一個類。我有一個Lib目錄,所以我把它放在那裏。

然後我說在MyProject.Web.App_Start.NinjectMVC3這樣的綁定:

private static void RegisterServices(IKernel kernel) 
{ 
    ... 
    kernel.Bind<IUser>().To<User>(); 
}  

我還添加了一個IUSER參數到我的基地倉庫類的構造函數是這樣的:

public abstract class RepositoryBase<T> where T : class, IEntity 
{ 
    #region Members 

    private UpDirContext dataContext; 
    private readonly IDbSet<T> dbset; 
    private readonly IUser user; 

    #endregion 

    protected RepositoryBase(IDatabaseFactory databaseFactory, IUser user) 
    { 
     DatabaseFactory = databaseFactory; 
     dbset = DataContext.Set<T>(); 
     this.user = user; 
    } 
    ... 

所以現在,我可以在我的存儲庫中的任何地方使用「用戶」。它正在工作,但我不確定這是否是構建事物的最佳方式。

我也認爲我可以使用注入來將IUser傳遞給我的基本實體類,並確保我的實體的CreatedBy和ModifiedBy屬性從開始就被正確填充,意味着對象構造,但是然後我的實體不會有一個零參數的構造函數,我不想這樣做。

更新2

這裏是我的服務構造的一個示例:

public partial class SectorService : ISectorService 
{ 
    private readonly ISectorRepository sectorRepository; 
    private readonly IUnitOfWork unitOfWork; 
    public SectorService(ISectorRepository sectorRepository, IUnitOfWork unitOfWork) 
    { 
     this.sectorRepository = sectorRepository; 
     this.unitOfWork = unitOfWork; 
    } 
    ... 

我已經使用了注射,以獲得各數據庫服務層。根據下面的評論,IUser應該被注入到服務層,我想知道什麼是最好的方法讓用戶從這個層傳遞到存儲庫。

回答

2

使用依賴注入,在你的組合根目錄中注入一個IUser(即你的控制器的構造函數 - 所有主要的DI容器都支持它,而plius mvc則支持它)。 IUser的具體實現引用HttpContext.Current.User.Identity.Name。IUser的所有接收器都不需要關心它來自哪裏。

我不是追隨爲什麼雖然你問關於createdby,等等。這是一個單獨的問題,或者你指的是會員資料?

+0

我也喜歡在需要的地方注入像IUser這樣的對象(控制器構造函數或其他)。該對象的實現可以在Web項目中並訪問HttpContext。我已經在可能具有windows服務或windows窗體應用程序的項目中使用這種模式,該應用程序使用IUser或類似對象的另一個實現,並發現使用依賴注入很好地解決了這個問題。 – 2012-01-14 08:09:59

+0

@Adam_Tuliper:我在哪裏談論CreatedBy等,這是同一個問題。我只是解釋爲什麼我需要在我的存儲庫中的用戶名。我正在使用Ninject作爲我的DI。所以根據我的理解,我應該簡單地爲IUser添加一個綁定,然後爲所有的存儲庫構造函數添加一個IUser參數。我跟着你吧? – 2012-01-14 17:37:28

+0

是的,你明白了。只要確保你的綁定是通過構造器注入理想地在你的控制器上進行的,而不是在較低級別的代碼中解析別的地方。注射應該始終儘可能接近入口點(成分根) – 2012-01-14 18:08:43

0

我最近的做法是將它從控制器 - >服務,然後服務 - >存儲庫(如有必要)傳遞。這是因爲我想要兩個網站(認爲公衆面對網站和私人API網站)使用相同的模型/存儲庫/服務,但每個網站的身份驗證方法都不相同。

+0

@Stephen_Booher你使用注射來做到這一點嗎? – 2012-01-19 21:47:42

相關問題