如何实现EF Code First和WCFDataService

时间:2013-05-30 00:05:11

标签: wcf entity-framework-4

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

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

从上到下,我创建了一个名为CompanyService的Service类,它继承自基本服务类。 CompanyService类包含Company Model的所有业务逻辑。此类使用Repository类来执行CRUD操作。然后,Repository会封装所有DataProvider类操作。

我已经做过一些关于在WCFDataService中使用EF的研究,但我无法理解如何用它来实现我的库,特别是在覆盖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);
    }
}

0 个答案:

没有答案