存储库模式和工作单元项目中域实体和数据实体之间的 c# 映射

c# mapping between Domain Entity and Data Entity in Repository Pattern and unit of work project

我有 C# 应用程序的 SOA 层架构。我已经在业务访问层 'Class Library Project' 中定义了业务/域实体......数据访问层中的数据实体 'Class Library Project' 和服务器端 WCF 的数据合同在 WCF 服务下 'Class Library Project'

企业实体

namespace App.Core.Entities
{
public class Member
{
    public int MemberID { get; set; }

    public string Title { get; set; }

    public string Surname { get; set; }

    public string Forename { get; set; }

    public string MiddleName { get; set; }
}

数据实体

namespace App.DAL.Entities
{
[Table("Member")]
public class Member
{
    [Key]
    public int MemberID { get; set; }

    public string Title { get; set; }

    public string Surname { get; set; }

    public string Forename { get; set; }

    public string MiddleName { get; set; }

  }

}

WCF 数据协定

namespace App.Services.Contracts 
{
[DataContract]
public class MemberData : IIdentifiableEntity
{
    [DataMember]
    public int MemberID { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Surname { get; set; }

    [DataMember]
    public string Forename { get; set; }

    [DataMember]
    public string MiddleName { get; set; }

    int IIdentifiableEntity.EntityId
    {
      get { return MemberID; }
      set { MemberID = value; }
    }
  }
}

通用存储库

 public interface IGenericRepository<TEntity> where TEntity :class
{

    global::System.Linq.IQueryable<TEntity> GetAll();
    TEntity GetEntityByID(int id);
    void InsertEntity(TEntity obj);
    void UpdateEntity(TEntity obj);
    void DeleteEntity(int id);

}

工作单元

namespace App.Repository.UnitOfWork
{
 public class MembershipManagement_UOF:IDisposable
 {        
    protected Member_Repository _Member_Repository;  

   public Member_Repository Member_Repository
    {
        get
        {
            if (this._Member_Repository == null)
            {
                this._Member_Repository = new Member_Repository(_MembershipContext);
            }

            return _Member_Repository;
        }
    }    
  }

现在我的问题是,当我 运行 从业务项目编写代码时,它应该只与存储库对话并且只使用业务实体作为成员,但它要求我在业务项目中添加来自 DAL 的引用

这是我出错的代码

 public IEnumerable<Member> GetAllMember()
    {
        using (var _uof = new MembershipManagement_UOF())
        {
            var entities = _uof.Member_Repository.GetAll();

            // return entities.ToList();

            return null;
        }
    }

错误

Severity    Code    Description Project File    Line    Suppression State
 Error  CS0012  The type 'Member' is defined in an assembly that is not referenced. You must add a reference to assembly 'App.DAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.  App.CoreServices    C:\My Work\Credit Union  Application\CreditSolutionApp\App.CoreServices\CoreServices\MembershipCore\MembershipCore.cs   23  Active

与原来的 post 有点难区分,但我怀疑你的 IGenericRepository 接口的具体实现引用了 Member class 来自DAL 而不是来自 BLL(业务逻辑层)。具体存储库需要使用 BLL 中的 Member class 作为其通用 TEntity 类型。具体存储库的方法 class 需要使用 DAL Member class 从数据库加载数据,然后将那些 DAL Member 实例映射到 BLL Member 实例,然后 return BLL Member 实例。

将 DAL 成员 class 重命名为 MemberDto 之类的名称可能有助于避免此处的混淆。所以,你可能会得到类似的结果(IGenericRepository<TEntity> 在你的 BLL 中,MyMemberRepo 在你的 DAL 中):

public class MyMemberRepo : IGenericRepository<Member>
{
    public IEnumerable<Member> GetAllMember()
    {
        // 1. Load the data from the data store into an IEnumerable<MemberDto>.
        // 2. Map the IEnumerable<MemberDto> to an IEnumerable<Member>, perhaps
        //   using something like the open source AutoMapper project.
        // 3. Return the IEnumerable<Member>.
    }
    // ... other interface implementations...
}