DI:将实体与存储库相关联

时间:2011-03-30 19:20:22

标签: c# architecture dependency-injection

我对这个概念很陌生。我要做的是创建一个工厂,它将返回一个用于存储库功能的对象。没有问题。所以我在main()中创建了一个具体工厂的实例,并将它存储在App的静态属性中,但我的实体位于一个单独的dll中。将存储库传递给构造函数中的每个实体类是否有意义?这感觉不对。我的问题是:最好的方法是让我的实体知道他们应该使用哪个存储库?

我的App部分类看起来像

public partial class App : Application
{
 private static ICalDataAccess _daqFactory;

 public static ICalDataAccess DataAccessFactory
 {
   set { _daqFactory = value; }
   get { return _daqFactory; }
 }
}

可能还需要更多的代码。

public class Widget
{
    public string Description { get; set; }
    public int ID { get; set; }

    private IWidgetRepository _widgetRepository;
    public Widget(IWidgetRepository WidgetRepository)
    {
        _widgetRepository = WidgetRepository;
    }

    public void Save()
    {
        _widgetRepository.Save(this);
    }
}

我在这里做了什么令人震惊的事情?

2 个答案:

答案 0 :(得分:3)

我认为一般建议是让您的实体免受持久性问题的影响。也就是说,您有一些代码可以检索实体并使用它们来执行需要完成的任何工作,从而生成新的,已删除或已修改的实体,然后调用代码将提交到相应的存储库(或者如果您要求保存则要求保存有一些跟踪或检测修改过的实体的东西,比如EF或NHibernate。

这样,您的实体根本不需要了解存储库。

我通常创建一个UnitOfWork助手类,通过“公共RepositoryFactory Repositories {get;}”属性公开我的所有存储库,这样只需提供UnitOfWork类的实例,我就可以访问我的所有数据源。然后可以通过IoC将UnitOfWork注入任何需要数据访问的类。

有关此主题的一些推荐阅读:

答案 1 :(得分:0)

您的描述听起来更像是服务定位器模式而不是依赖注入。依赖注入通常看起来像任何需要一些服务对象(例如数据访问)来完成其工作的对象将该服务作为其构造函数的参数接收。