我知道你可以通過使用User.Identity.Name從控制器中獲取當前登錄用戶的用戶名。然而,我的解決方案是在4層(4個項目)拆分:ASP.Net MVC 3 - 從存儲庫中獲取登錄用戶名的最佳方式是什麼?
- MyProject.Domain爲模特
- MyProject.Data的倉庫
- MyProject.Services這裏的生意邏輯是
- 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應該被注入到服務層,我想知道什麼是最好的方法讓用戶從這個層傳遞到存儲庫。
我也喜歡在需要的地方注入像IUser這樣的對象(控制器構造函數或其他)。該對象的實現可以在Web項目中並訪問HttpContext。我已經在可能具有windows服務或windows窗體應用程序的項目中使用這種模式,該應用程序使用IUser或類似對象的另一個實現,並發現使用依賴注入很好地解決了這個問題。 – 2012-01-14 08:09:59
@Adam_Tuliper:我在哪裏談論CreatedBy等,這是同一個問題。我只是解釋爲什麼我需要在我的存儲庫中的用戶名。我正在使用Ninject作爲我的DI。所以根據我的理解,我應該簡單地爲IUser添加一個綁定,然後爲所有的存儲庫構造函數添加一個IUser參數。我跟着你吧? – 2012-01-14 17:37:28
是的,你明白了。只要確保你的綁定是通過構造器注入理想地在你的控制器上進行的,而不是在較低級別的代碼中解析別的地方。注射應該始終儘可能接近入口點(成分根) – 2012-01-14 18:08:43