NHibernate应该负责从域对象映射到视图模型吗?

时间:2013-06-26 21:52:06

标签: asp.net-mvc fluent-nhibernate fluent-nhibernate-mapping sharp-architecture

我已经开始了一个新项目,并决定使用Fluent nHibernate为我的ORM使用SharpArchitecture。 (我以前从未使用过nHibernate或SharpArchitecture,所以如果我错过了什么就要温柔一点)

我正在尝试做什么,我不确定这是否是正确的方法,或者如果它甚至可能使用nHibernate映射是采取域实体让我们说客户端并将其映射到更轻的ClientModel将在我看来使用。更轻的模型的原因是我不想带回该视图的客户端实体中的额外信息。

所以我的想法是除了我的客户端实体之外创建一个只有几个字段的ClientModel实体,并使用nHibernate将这两个字段映射在一起。

我尝试了一些东西,但他们都失败了。

我的问题 - 这是我应该使用nHibernate还是应该使用像automapper这样的东西?我是否在nHibernate中混淆了map这个词,假设它意味着它没有?

寻找一些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;
        }
}

2 个答案:

答案 0 :(得分:2)

听起来你对于需要做什么有一个很好的高层次想法。您应该使用NHibernate将数据发送和检索到数据库 - 而不是映射到客户端。将仅需要的数据发送回客户端。我是Automapper的粉丝,并使用它在数据对象和通过用户界面公开的视图模型之间进行映射。

这是一个非常简单的示例,但假设您有一个帐户控制器,它将在视图中显示帐户信息。您可以使用以下内容从数据库中获取信息并将其映射到viewmodel

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));

答案 1 :(得分: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));

        }