我对这个概念很陌生。我想要做的是创建一个工厂,它将返回一个用于存储库功能的对象。那里没有问题。因此,我在 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);
}
}
我在这里做了什么过分的事吗?
最佳答案
我认为一般建议是让您的实体免于持久性问题。也就是说,您有一些代码可以检索实体并使用它们来执行任何需要完成的工作,从而产生新的、删除的或修改的实体,然后调用代码将这些实体提交到适当的存储库(或者如果您要求保存有一些东西可以跟踪或检测修改过的实体,比如 EF 或 NHibernate)。
这样一来,您的实体根本不需要了解存储库。
我通常创建一个 UnitOfWork 帮助程序类,它通过“public RepositoryFactory Repositories { get; }”属性公开我的所有存储库,因此只需提供 UnitOfWork 类的一个实例,我就可以访问我的所有数据源。然后可以通过 IoC 将 UnitOfWork 注入(inject)到任何需要访问数据的类中。
关于这个主题的一些推荐读物:
关于c# - DI : Associating entities with repository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5491154/