我正在用ASP.NET MVC 5、EF (5或6)、Oracle11g和Kendo开发一个应用程序。
现在,我想对应用程序进行分层(体系结构)。所以,请给我指导如何分层的项目和不同的方式分层的项目。
我读过关于通用存储库模式的文章,我有以下问题,
或者还有什么其他的模式我们可以用吗?
对不起,这可能是个简单的问题,但我对分层(建筑师)项目还是新手。那么,请指导我如何分层的项目?
谢谢,
普拉卡什。
发布于 2015-09-10 13:17:32
DbSet类本身就是存储库,我看不到在存储库之上构建存储库的真正优势。因此,例如,要创建一个新用户,我将使用:
UserEntity CreateUser(UserToCreate objectToCreate),UserEntity是您的实体,UserToCreate是一个POCO,它只公开创建新用户所需的属性。此方法将位于Business程序集中,并从控制器调用。UserCreateModel,由UserCreate视图和控制器使用UserCreateModel与UserToCreate之间的手动映射UserToCreate与UserEntity之间的手动映射UserEntity将有其他属性不被用户创建使用/相关(并且您不希望通过CreateUser方法公开这些属性)UserCreateModel可以具有与视图的设计方式完全相关的附加属性(例如:您将有两个Password属性,因此用户必须在Create视图中确认密码,但用户创建UserToCreate只需要一个Password属性)发布于 2015-09-10 14:31:25
@ken2k基本上是四舍五入的,但我只想指出,虽然使用EF使用存储库模式是不可取的,但仍然抽象化您对实体框架的使用并不是个坏主意。我个人使用的是策略模式,其中创建的接口本质上保存了应用程序可以使用的Api,然后根据所处理的源类型(实体框架、Web API等)实现该接口的一个或多个实现。在您的应用程序中,您只需要引用接口,然后使用依赖项注入来替代适当的实现。这让你可以在以后的时候换掉“策略”。例如,如果您稍后发现自己想从EF切换到类似Dapper的东西,您只需要为Dapper创建一个新的实现,然后将它与DI容器交换。应用程序的其余部分没有一个更明智。
此外,我发现让我的实体实现各种接口是有益的,然后允许我在我的策略实现中创建通用方法,这些方法可以与类似类型的对象一起工作。例如,我可能有这样的东西:
public interface IPublishable
{
PublishStatus Status { get; set; }
DateTime? PublishDate { get; set; }
DateTime? ExpireDate { get; set; }
}然后,我可以实现这样的方法:
public IEnumerable<TEntity> GetPublished<TEntity>()
where TEntity : IPublishable
{
...
}在该方法中,我可以使用Status、PublishDate和ExpireDate自由查询实体,因为接口保证任何有资格使用该方法的类都具有这些属性。
https://stackoverflow.com/questions/32502821
复制相似问题