c# - DI : Associating entities with repository

标签 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);
    }
}

我在这里做了什么过分的事吗?

最佳答案

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

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

我通常创建一个 UnitOfWork 帮助程序类,它通过“public RepositoryFactory Repositories { get; }”属性公开我的所有存储库,因此只需提供 UnitOfWork 类的一个实例,我就可以访问我的所有数据源。然后可以通过 IoC 将 UnitOfWork 注入(inject)到任何需要访问数据的类中。

关于这个主题的一些推荐读物:

关于c# - DI : Associating entities with repository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5491154/

相关文章:

c# - 如何在 C# 中跟踪另一个进程执行的当前代码行

c# - 使用 C# 创建 Azure 存储帐户抛出异常 "The request was aborted: Could not create SSL/TLS secure channel."

c# - 从第三方数据源导入数据(开放架构设计)

dependency-injection - 依赖注入(inject)模块化依赖注册

c# - 使用 INotifyPropertyChanged 在 Windows 窗体中绑定(bind) RadioButton?

C# - 反序列化 SOAP 消息

architecture - 配置优先级 - 最佳实践

architecture - 六边形架构 - 一个简单的用例

java - 如何为枚举对象编写自定义提供程序?

.net - 您使用哪个 .NET 依赖注入(inject)框架?