2017-04-05 78 views
0

我们有一个项目,我们试图从我们的服务层中删除DAL的依赖项。我们已将项目中的使用语句引用与project.json中的参考一起引用。使用C#n层应用程序从服务层删除DAL依赖关系

现在我们有这样的事情在我们的业务层以下......

var stockItem= await _unitOfWork.StockRepo.FindOne(p => p.product == product && p.warehouse == warehouse).FirstOrDefaultAsync(); 

这正是诸如此类的事情,我们是后。问题是当我们将鼠标悬停在var stockItem上时,工具提示显示DAL.entities.Stock,因此我们仍然存在依赖关系。那么这是否意味着我们的服务层仍然知道我们的DAL。任何人都有任何想法如何消除这个问题。

+0

你可以提取你的实体到另一个项目。 – Simon

+0

你的服务层使用你的数据层,这很好。所以你的服务层会知道这个实体是这个参考的一部分。这很常见,除非你像上面提到的那样将你的实体移动到另一个项目中。 – Ric

+0

服务层需要了解实体,但不涉及数据层的其余部分。 – Simon

回答

1

有一点你必须把服务层和DAL结合在一起。但是你可以把它分成不同的程序集。在ServiceLayer Foo.Services.Core.dll

namespace Foo.Services.Core.Models 
{ 
    public class Foo 
    { 
     ... 
    } 
} 

namespace Foo.Services.Core.DataServices 
{ 
    public interface IFooService 
    { 
     Task<Foo> GetByIdAsync(int id); 
    } 
} 

下一个项目的

定义将更加具体了的UnitOfWork Foo.Services.Impl.UnitOfWork.dll

namespace Foo.Services.Impl.UnitOfWork 
{ 
    public class UnitOfWorkFooService : IFooService 
    { 
     private readonly IUnitOfWork _uow; 
     public UnitOfWorkFooService(IUnitOfWork uow) 
     { 
      _uow = uow; 
     } 

     public Task<Foo> GetByIdAsync(int id); 
     { 
      return await _uow.FooRepo.FindOne(...).FirstOrDefaultAsync(); 
     } 
    } 
} 

或者,也许在未来的一共有不同跟一个REST API Foo.Services.Impl.RestApi.dll

namespace Foo.Services.Impl.RestAPI 
{ 
    public class RestApiFooService : IFooService 
    { 
     private readonly IRestApi _restapi; 
     public RestApiFooService(IRestApi restapi) 
     { 
      _restapi = restapi; 
     } 

     public Task<Foo> GetByIdAsync(int id); 
     { 
      return await _restapi.FooEndpoint.GetAsync(id); 
     } 
    } 
}