如何将数据实体映射到通用存储库中的业务实体和 C# 应用程序的工作单元

How map data entities to business entities in generic repository and unit of work for C# application

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

我的问题是我应该如何以及在何处将数据实体映射到通用存储库和工作单元模式中的业务实体。

企业实体

using System;
using System.Collections.Generic;
using System.Linq;

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

数据实体

using System;
using System.Collections.Generic;
using System.Linq;    

namespace App.DAL.Entities
{
[Table("Member")]
public class MemberEntity    
{
    [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; }

  }

}

会员背景

 using App.DAL.Entities;

 public class MembershipContext :BaseContext<MembershipContext>
{
    public DbSet<MemberEntity> Member { get; set; }
}

WCF 数据协定

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Runtime.Serialization;

using App.Core.CoreInterfaces;

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

}

通用存储库实现

 public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
    protected DbSet<TEntity> _DbSet;
    private readonly DbContext _dbContext;

    public GenericRepository()
    { }

    public GenericRepository(DbContext dbContext)
    {
        this._dbContext = dbContext;
        _DbSet = _dbContext.Set<TEntity>();
    }

    public IQueryable<TEntity> GetAll()
    {
        return _DbSet;
    }
   //...rest of code
 }

会员库

using App.Repository;
using App.DAL.Entities;

namespace App.Repository
{
public class Member_Repository: GenericRepository<MemberEntity>
{
    public Member_Repository() { }

    public Member_Repository(DbContext dbContext)
        :base(dbContext)
    { }
  }
}

工作单元

using App.Repository;
using App.DAL.DatabaseContext;
using App.DAL.Entities;    

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 的引用

这是我出错的代码

 using App.Repository.UnitOfWork;
 using App.Core.Entities;     

 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

您现在正在使用 DAL 中的类型的 BAL 类 中公开 methods/properties。因此,要使用这些 BAL 类,您需要了解 DAL。要解决此问题,您需要先将 DAL 对象转换为 BAL 对象,然后再从 BAL 中 returning 它们。

更好的解决方案是让BAL 也不知道DAL 对象。 DAL 应该 returns BAL 可以处理的对象,也可以 return 给调用者。从 DAL 类型到 BAL 类型的任何转换都是 DAL 的关注点,而不是 BAL。