日期:2014-05-20  浏览次数:20788 次

泛型问题:Repository入口设计问题
本帖最后由 luomingui 于 2014-01-03 15:04:23 编辑
看了好多
/// <summary>
/// 仓库类
/// </summary>
public class EFRepository<TEntity> : Domain, IRepository<TEntity> where TEntity : class
{
    public EFRepository( )
    {
        this.ListType = typeof(TEntity);
    }
     public IList<TEntity> GetAll( )
     {
           //获取所有实体数据
     }
}
仓库API设计:
public static class EF
{
     //根据实体读取仓库
     public static EFRepository<TEntity> Create<TEntity>( ) where TEntity : class
     {
         return EFRepositoryFactory.Instance.Find<TEntity>();
     }
     //直接读取仓库
     public static EFRepository<TEntity> Concreate<TEntity>( ) where TEntity : class
     {
       return new EFRepository<TEntity>();
     }

}
//==============User仓库实现=============================================
/// <summary>
/// 用户
/// </summary>
[Serializable]
public class User : Entity<User>
{
    public string Code { set; get; }
    public string Name { set; get; }
    public string Password { set; get; }

    protected IList<User> QueryBy(string code)
    {
        return this.QueryDb(q => q.Code.Equals(code));
    }
}
/// <summary>
/// 用户仓库类  GetByCode和GetBy 是所有用户仓库类的其他仓库没有的。
/// </summary>
public class UserRepository : EFRepository<User>
{
    protected UserRepository( ) { }

    public User GetByCode(string code)
    {
        return this.FetchFirstAs<User>(code);
    }

    public User GetBy(string code, string password)
    {
        var user = this.GetByCode(code);
        if (user != null && user.Password == password) { return user; }
        return null;
    }
}
//====================测试=========================================
[TestMethod]
public void GetAll( )
{
    var list = EF.Create<User>().GetAll();
}
[TestMethod]
public void TestCreateConcreate( )
{
    /*
      效果: 使用EF读取UserRepository仓库并且调用GetByCode函数
      问题: 在这里不能调用GetByCode函数?不知道EF类需要如何修改。
    */
    var list = EF.Concreate<UserRepository>().GetByCode("");
}


------解决方案--------------------
var list = ((UserRepository)EF.Concreate<User>()).GetByCode("");
  
*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
------解决方案--------------------
用语言描述逻辑,少用代码。