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