2015-02-05 29 views
3

介绍EF N层架构

我们需要建立一个n层应用程序,因为我们想在多个平台上分享我们的BL和只写我们的DAL一次。我已经在这个主题上做了一些研究。

在大卫皮拉斯的帖子中可以看到:MVC3 and Entity Framework每个VS解决方案必须至少有4层。到现在为止还挺好。

他还指出,DAL项目是唯一允许甚至知道EF正在使用的项目。

问题1:

我假设,即“接口”项目的接口是我的EF实体的1对1的表示,我是正确的呢?另外,这些接口应该用作不同层之间的类型?

问题2:

MSDN建议一个的DbContext的寿命应为每一个请求上下文的WebApp,并且在WPF或WinForms项目每形成一个上下文。那么,如何在不向我的GUI层添加“System.Data.Entity”的情况下实现这一目标?

Thnx提前!

+0

thnx为downvote,如果我失去了一些东西,请关心评论..我已经投入了一些精力和时间来问这些问题。 –

回答

2

首先不要!!!在多个平台上分享您的DAL。分享您使用DAL的BL。只要你的BL代表你的应用程序需求的解决方案,你不需要公开你的DAL,请不要。另外公开DAL的缺点是将更多漏洞暴露给黑客,直接访问DAL为BL中的业务逻辑,控制和验证提供了一种btpass机制。

答案1: 可能但不需要。考虑到SOA,我建议使用DTO。要么它们是实体或更复杂的几个和/或部分实体的组合类。如果使用实体,则可以更灵活地通过BL提供信息(您可以通过一次方法调用同时发送多个数据部分),并将第三方用户的实体(也是数据库结构)隐藏起来,从而提供更好的安全感。

回答2: 再次,考虑SOA的思想,不要根据您的用户界面构建您的BL /服务方法。 BL(顾名思义)根据“如何完成工作”而不是“”如何由用户在屏幕上完成工作“提供数据。如果您尝试从GUI管理数据,您也将开始违反N层体系结构。 不要!!!使用DAL之外的任何数据特定类和/或方法。这将是分层的真正用途。

问候。

+0

Thnx为您的快速反应!我很抱歉,我的意思是说没有将DAL分享给其他GUI,而是只写一次!我的错。 –

+0

如果我有帮助,我很高兴。 – user3021830

+0

是的,你有帮助;)。我会在几个小时内回答问题,我还在等待更多意见,而且我认为当问题仍未得到答复时,人们更加渴望。 –

3

您需要使用Unit of WorkRepository模式和依赖注入框架,如StructureMapUnity

基本上,你需要做的是创造的接口:

public interface IUnitOfWork 
{ 
    void SaveChanges(); 
} 

public interface IRepository<TItem> 
{ 
    TItem GetByKey<TKey>(); 

    IQueryable<TItem> Query(); 
} 

现在,在DbContext类实现的接口上面,有的地方在业务层注册接口的实现:

public void RegisterDependencies(Container container) 
{ 
    // Container is a Structure Map container. 
    container.ForRequestedType<IUnitOfWork>() 
     .CacheBy(InstanceScope.HttpContext) 
     .TheDefaultConcreteType<DbContext>();  
} 

请参阅StructureMap Scoping Docs了解如何配置实例的范围。

现在,随着地方所有的代码,每个Business Layer类需要进行一些数据的操作是这样的:

public class SomeService 
{ 
    public SomeService(IRepository<SomeItem> repository, IUnitOfWork unitOfWork) 
    { 
     this.repository = repository; 
     this.unitOfWork = unitOfWork; 
    } 

    public void MarkItemCompleted(int itemId) 
    { 
     var item = repository.GetByKey(itemId); 
     if(item != null) 
     { 
      item.Completed = true; 
      unitOfWork.SaveChanges(); 
     } 
    } 
} 

现在,隐藏后厂式服务的创建:

public class ServiceFactory 
{ 
    private readonly Container container;// = initialize the container 

    public TService CreateService<TService>() 
    { 
     return container.GetInstance<TService>(); 
    } 
} 

而在你的GUI层只调用通过ServiceFactory创建的服务类的方法;如果您的GUI是ASP.NET MVC项目,则不需要创建ServiceFactory类 - 您可以从DefaultControllerFactory派生并覆盖GetControllerInstance方法。一个例子见the answer here

+0

Thnx为您的明确回应!这非常有帮助。我已经遇到了Repositry和UOW模式。我认为回购的实施应该在DAL中,我是否正确? Thnx再次。 –

+0

@MarkRijsmus,是的,它应该在数据访问。 – RePierre