1

先说一点历史。我创建了一个 EF Code First 库,其中包含作为我的模型的 POCO 对象、从 DbContext 继承的通用 DataProvider、实现通用 DataProvider 的通用 Repostory 以及实现存储库的通用服务。我已经在 WPF (MVVM)、ASP.Net、Window Forms 和 ASP MVC 应用程序中成功使用了这个库。

在本次讨论中,我将参考公司模型

从上到下,我创建了一个名为 CompanyService 的服务类,它继承自基础服务类。CompanyService 类包含公司模型的所有业务逻辑。该类使用 Repository 类来执行 CRUD 操作。然后 Repository 封装了所有 DataProvider 类操作。

我已经对将 EF 与 WCFDataService 一起使用进行了一些研究,但我无法理解如何使用它来实现我的库,尤其是在覆盖 CreateDataSource() 方法时。

可能我应该只使用 WCF 服务,也许我不了解 WCFDataService 的目的。

我列出了所涉及类的部分代码:

public class CompanyService : ServiceBase<Company> ,ICompanyService
{
    public Company GetCompanyByFolderId(string eFolderId)
    {
        return (Company)GetModelByFolderId(eFolderId);
    }
}

public abstract class ServiceBase<TModel> : IService<TModel> where TModel : class, IModel
{
    private IDataProvider _dataProvider;
    public IDataProvider DataProvider
    {
        get
        {
            if (_dataProvider == null)
            {
                string connectionStringName = Properties.Settings.Default.DataProvider;
                bool enableLazyLoading = true;

                _dataProvider = new DataProvider(connectionStringName, enableLazyLoading);
            }

            return _dataProvider;
        }
        set
        {
            _dataProvider = value;
        }
    }

    private IRepository<TModel> _repository;
    public IRepository<TModel> Repository
    {
        get
        {
            if (_repository == null)
            {
                _repository = new Repository<TModel>(DataProvider);
            }
            return _repository;
        }
        set
        {
            _repository = value;
        }
    }

    public TModel GetModelByFolderId(String folderId)
    {
        return GetTable().FirstOrDefault(o => o.EFolderid == folderId);
    }

    public virtual IQueryable<TModel> GetTable()
    {
        return Repository.GetTable();
    }
}

public class Repository<TModel> : IRepository<TModel> where TModel : class, IModel
{
    private IDataProvider _dataProvider;

    public Repository(IDataProvider dataProvider)
    {
        _dataProvider = dataProvider;
    }

    private IDbSet<TModel> DbSet
    {
        get
        {
            return _dataProvider.Set<TModel>();
        }
    }

    public IQueryable<TModel> GetTable()
    {
        return _dataProvider.GetTable<TModel>();
    }
}


public class DataProvider : DbContext, IDataProvider 
{
    public DataProvider()
    {
    }

    public DataProvider(string connectionStringName, bool enableLazyLoading = true)
        : base(connectionStringName)
    {
        Configuration.LazyLoadingEnabled = enableLazyLoading;
        //Configuration.ProxyCreationEnabled = false;
    }

    public new IDbSet<TModel> Set<TModel>() where TModel : class
    {
        return base.Set<TModel>();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new CompanyMapping());

        base.OnModelCreating(modelBuilder);
    }

    public IQueryable<TModel> GetTable<TModel>() where TModel : class
    {
        return Set<TModel>().AsQueryable();
    }
}

然后我的测试看起来像这样:

[TestClass()]
public class CompanyServiceTest
{
    [TestMethod()]
    public void GetCompanies()
    {
        CompanyService target = new CompanyService();
        IQueryable<Company> companies = target.GetTable();
        Assert.IsNotNull(companies);
    }

    [TestMethod()]
    public void GetCompanyByFolderId()
    {
        CompanyService target = new CompanyService();
        Company company = target.GetCompanyByFolderId("0000000000000000000000000172403");
        Assert.IsNotNull(company);
    }
}
4

0 回答 0