2

我已經開始一個新項目,並決定使用SharpArchitecture和Fluent nHibernate來爲我的ORM。 (我之前從未使用過nHibernate或SharpArchitecture,因此如果我錯過了某些東西,那麼請溫柔)NHibernate應該負責從域對象映射到視圖模型嗎?

我在做什麼,我不確定這是否是正確的方式或者甚至可能與nHibernate地圖是採取一個域實體可以說客戶端,並將其映射到一個較輕的ClientModel將在我看來使用。較輕型號的原因是我不想爲此視圖帶回客戶端實體中的額外信息。

所以我的想法是除了我的客戶端實體創建一個只有幾個字段的ClientModel實體並使用nHibernate將兩者映射到一起。

我試過一些東西,但都失敗了。

我的問題 - 這是我應該使用nHibernate或我應該使用類似automapper的東西?我是否認爲nHibernate中的單詞映射表示它不是什麼?

尋找一些nHibernate專家來幫助我。

另外一個小樣本將不勝感激。

這是一些代碼。

public class Client : EntityWithTypedId<Guid> 
    { 
     public virtual String Name { get; set; } 
     public virtual String Slug { get; set; } 
     public virtual IList<Address> Addresses { get; set; } 
     public virtual String ClientSize { get; set; } 
     public virtual String Industry { get; set; } 
     public virtual String Founded { get; set; } 
     public virtual String Type { get; set; } 
     public virtual String Specialty { get; set; } 
     public virtual Boolean ShowOnWebsite { get; set; } 
     public virtual Image Logo { get; set; } 
     public virtual Image LogoBlackAndWhite { get; set; } 
     public virtual Image LogoHighResolution { get; set; } 
     public virtual String FacebookUrl { get; set; } 
     public virtual String TwitterUrl { get; set; } 
     public virtual String LinkedInUrl { get; set; } 
     public virtual IList<Project> Projects { get; set; } 
     public virtual IList<Tag> Tags { get; set; } 
     public override Guid Id { get; protected set; } 
     public virtual DateTime CreatedDate { get; set; } 
     public virtual String CreatedBy { get; set; } 
     public virtual DateTime ModifiedDate { get; set; } 
     public virtual String ModifiedBy { get; set; } 
     public virtual DateTime? DeletedDate { get; set; } 
     public virtual String DeletedBy { get; set; } 
    } 

public class ClientViewModel 
    { 
     public virtual String Name { get; set; } 
     public virtual String Slug { get; set; } 
    } 


public class ClientTasks : IClientTasks 
    { 
     private readonly IRepositoryWithTypedId<Client, Guid> _clientRepository; 
     private readonly IRepositoryWithTypedId<Image, Guid> _imageRepository; 
     public ClientTasks(IRepositoryWithTypedId<Client, Guid> clientRepository, IRepositoryWithTypedId<Image, Guid> imageRepository) 
     { 
      _clientRepository = clientRepository; 
      _imageRepository = imageRepository; 
     } 

     public List<Client> GetAll() 
     { 
      var allClients = _clientRepository.GetAll().ToList(); 
      return allClients; 
     } 
} 

回答

0

所以爲了這個,我決定將來自任務層(僅返回完整對象的存儲庫)的代碼放入每個視圖的查詢類(僅選擇我想要的屬性並將它們映射到ViewModel)。

另外我決定使用通過nhibernate的映射,因爲選擇特定的列迫使我映射字段無論如何回到我的領域從對象數組,所以我想,因爲我已經需要這樣做,我可能只是使用TransformUsing方法。

ClientListQuery.cs

public IList<ClientListViewModel> GetClientListQuery() 
     { 
      ClientListViewModel clientListViewModel = null; 
      return Session.QueryOver<Client>() 
       .OrderBy(o => o.Name).Asc 
       .SelectList(list => list 
       .Select(c => c.Id).WithAlias(() => clientListViewModel.Id) 
       .Select(c => c.Name).WithAlias(() => clientListViewModel.Name) 
       ... 
       .Select(c => c.Logo.Id).WithAlias(() => clientListViewModel.LogoId) 
       .Select(c => c.LogoBlackAndWhite.Id).WithAlias(() => clientListViewModel.LogoBlackAndWhiteId)) 
       .TransformUsing(Transformers.AliasToBean<ClientListViewModel>()) 
       .List<ClientListViewModel>(); 
     } 

客戶機控制器

[Transaction] 
     public ActionResult Read([DataSourceRequest] DataSourceRequest request) 
     { 
      return Json(_clientListQuery.GetClientListQuery().ToDataSourceResult(request)); 

     } 
2

這聽起來像你有什麼需要做的高層次的想法。您應該使用NHibernate向數據庫發送和檢索數據 - 而不是映射到客戶端。只發送您需要的數據返回給客戶端。我是Automapper的粉絲,並使用它來映射通過用戶界面公開的數據對象和視圖模型。

這是一個非常微不足道的例子,但想象一下你有一個賬戶控制器,它將在視圖中顯示賬戶信息。你可以使用類似下面的東西從數據庫中獲取信息,並將其映射到一個視圖模型

public ActionResult Index(){ 
    var myAccount = _session.Get<Account>(1); 
    var viewModel = _mapper.Map<Account,AccountViewModel>(myAccount); 
    return View(viewModel); 
} 

在你automapper映射文件,建立這樣的:

Mapper.CreateMap<Account, AccountViewModel>() 
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.FullName)) 
    .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FName)); 
+0

這是有道理的。所以我使用IRepositoryWithTypedId將它傳遞給我的任務構造器,但似乎無法弄清楚如何只選擇某些字段?這可能嗎? –

+0

我沒有使用SharpArchitecture,但是在大多數存儲庫模式實現中,您將撤回整個項目(大多數實現支持獲取,保存,FindAll 等)。除非有可查詢的實現,否則你幾乎會從數據庫中取回整個對象 –

相關問題