我的项目分层如下: -
DAL (Entity)
- > BLL (DTO)
- > ApplicationComponent (ViewModel)
。
应用程序的多个组件(ApplicationComponent
)将访问BLL
。组件包括Windows服务,Web服务,Web API和MVC控制器。
我正在将NHibernate
Entity
个对象转换为DTO
个对象,同时将它们从DAL
传递到BLL
。将此状态传递给ApplicationComponent
时,BLL
再次将其转换为ViewModel
。
这有助于我分清问题以及每层中数据的处理方式。我不赞成返回NHibernate
Entity
个对象进行查看,原因如下: -
UI
(或者只在需要时公开),如密码,用户类型,权限等。NHibernate
在访问属性时执行其他查询,这会使延迟加载无效。Entity
)公开的不必要数据会给错误带来混乱和差距。BLL
/ UI
。 Entity
不适用于UI
。在所有情况下都无法提供UI
。DTO
属性上的属性进行用户输入验证,Entity
看起来很奇怪。我面临以下问题: -
AutoMapper
或类似的东西来最小化;但它没有完全解决问题。答案 0 :(得分:1)
您是否考虑过在DTO和实体之间创建共享接口?您不应将ORM与其他应用程序紧密结合。或者实际上,只要有可能,请使用它们之间的接口以外的任何东西。
理论上,您可以有一个单独的项目,该项目仅包含您希望传递的内容的合同/摘要。为了最大程度地减少映射开销并将其开放给扩展,您可以确保实体按预期实现接口(省略不需要的接口),并且在需要定制DTO的情况下,可以使用接口创建带有映射的模型。
添加额外的接口项目时会产生一些开销,但是从长远来看,它将使您的代码更整洁,更可维护。
namespace Data
{
public class FakeRepo : IFakeRepo
{
public IThisIsAnEntity GetEntity()
{
return new ThisIsAnEntity();
}
}
public class ThisIsAnEntity : IThisIsAnEntity
{
public string HiddenField { get; set; }
public long Id { get; set; }
public string SomeField { get; set; }
public string AnotherField { get; set; }
}
}
namespace Data.Abstractions
{
public interface IFakeRepo
{
IThisIsAnEntity GetEntity();
}
}
namespace Abstractions
{
public interface IThisIsAnEntity : IThisIsAnSlimmedDownEntity
{
string SomeField { get; set; }
}
public interface IThisIsAnSlimmedDownEntity
{
long Id { get; set; }
string AnotherField { get; set; }
}
}
namespace Services.Abstractions
{
public interface ISomeBusinessLogic
{
IThisIsAnEntity GetEntity();
IThisIsAnSlimmedDownEntity GetSlimmedDownEntity();
}
}
namespace Services
{
public class SomeBusinessLogic : ISomeBusinessLogic
{
private readonly IFakeRepo _repo;
public SomeBusinessLogic(IFakeRepo repo)
{
_repo = repo;
}
public IThisIsAnEntity GetEntity()
{
return _repo.GetEntity();
}
public IThisIsAnSlimmedDownEntity GetSlimmedDownEntity()
{
return _repo.GetEntity();
}
}
}
namespace UI
{
public class SomeUi
{
private readonly ISomeBusinessLogic _service;
public SomeUi(ISomeBusinessLogic service)
{
_service = service;
}
public IThisIsAnSlimmedDownEntity GetViewModel()
{
return _service.GetSlimmedDownEntity();
}
public IComposite GetCompositeViewModel()
{
var dto = _service.GetSlimmedDownEntity();
var viewModel = Mapper.Map<IThisIsAnSlimmedDownEntity, IComposite>(dto);
viewModel.SomethingSpecial = "Something else";
return viewModel;
}
}
public class SomeViewModel : IComposite
{
public long Id { get; set; }
public string AnotherField { get; set; }
public string SomethingSpecial { get; set; }
}
}
namespace UI.Abstractions
{
public interface IComposite : IThisIsAnSlimmedDownEntity, ISomeExtraInfo
{
}
public interface ISomeExtraInfo
{
string SomethingSpecial { get; set; }
}
}
答案 1 :(得分:0)
nhibernate是使您避免拥有DAL实体的orm之一,它的性能最好避免从BLL到DAL的额外映射,但是如果对您而言并不重要,则最好保留使应用程序层松耦合