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

时间:2016-06-15 12:43:13

标签: c# wcf entity-framework-6 repository-pattern soa

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

商业实体

RTRIM

数据实体

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

}

WCF数据合同

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

  }

通用存储库

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

}

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

这是我得到错误的代码

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

错误

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

            // return entities.ToList();

            return null;
        }
    }

1 个答案:

答案 0 :(得分:1)

从原始帖子中说出来有点困难,但我怀疑你IGenericRepository接口的具体实现是从DAL而不是BLL(业务逻辑层)引用Member类。 )。具体的存储库需要使用BLL中的Member类作为其通用TEntity类型。具体的存储库类的方法需要使用DAL Member类从数据库加载数据,然后将这些DAL Member实例映射到BLL Member实例,然后返回BLL Member个实例。

将DAL成员类重命名为MemberDto之类的内容可能有助于避免混淆。因此,您最终可能会得到类似的内容(您的BLL中IGenericRepository<TEntity>,而DAL中的MyMemberRepo):

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