依赖注入和实体框架

2023-11-29

我正在使用 MVVM light 及其 Ioc 来做一个 wpf 应用程序SimpleIoc.

我实现了这样的存储库模式:

 public interface ICrud<T> where  T : class 
    {
        IEnumerable<T> GetAll();
        Task<IEnumerable<T>> AsyncGetAll(); 
        void AddNew(params T[] items);
        void Delete(params T[] items);
        void Update(params T[] items);
        void SaveOrUpdate(params T[] items);
    }

 public class Crud<T> : ICrud<T> where T : class 
    {

        public void AddNew(params T[] items)
        {
            using (var context = new DataEntities())
            {
                foreach (T item in items)
                {
                    context.Entry(item).State = System.Data.Entity.EntityState.Added;
                }
                context.SaveChanges();
            }
        }

        public void Delete(params T[] items)
        {
            using (var context = new DataEntities())
            {
                foreach (T item in items)
                {
                    context.Entry(item).State = System.Data.Entity.EntityState.Deleted;
                }
                context.SaveChanges();
            }
        }

        public void Update(params T[] items)
        {
            using (var context = new DataEntities())
            {
                foreach (T item in items)
                {
                    context.Entry(item).State = System.Data.Entity.EntityState.Modified;
                }
                context.SaveChanges ();
            }
        }


        public  void SaveOrUpdate(params T[] items)
        {
            using (var context = new DataEntities())
            {
                foreach (T item in items)
                {
                    try
                    {
                        context.Entry(item).State = System.Data.Entity.EntityState.Modified;
                         context.SaveChanges();
                    }
                    catch (Exception)
                    {
                        context.Entry(item).State = System.Data.Entity.EntityState.Added;
                         context.SaveChanges();
                    }

                }

            }
        }

        public IEnumerable<T> GetAll()
        {
            using (var context = new DataEntities())
            {
                DbSet<T> dbSet = context.Set<T>(); 
                return dbSet.AsEnumerable().ToList();
            }
        }


        public Task<IEnumerable<T>> AsyncGetAll()
        {
            return Task.Factory.StartNew(() =>
            {

                    var context = new DataEntities();
                    DbSet<T> dbSet = context.Set<T>();
                    return dbSet.AsEnumerable();

            });
        }
    }

在视图模型定位器中,我像这样注入依赖项:

 static ViewModelLocator()
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
            SimpleIoc.Default.Register<IDataService, DataService>();
             SimpleIoc.Default.Register<ICrud<student>, Crud<student>>();
            SimpleIoc.Default.Register<ICrud<prof>, Crud<prof>>();
//Add the other EF entities dependencies
        }

我的问题是,当我要执行 CRUD 操作时,我必须在调用之前实例化 EF 实体,例如:

SimpleIoc.Default.GetInstance<ICrud<student>>().AddNew();

我需要知道 :

  1. 像上面那样实例化一个EF,是否违反了这个概念依赖注入
  2. 如果是这样,我该如何解决这个问题?

你不应该注入实体。实体不是服务。您使用依赖项注入构建的对象图应该仅包含服务。任何包含运行时数据(实体、消息、DTO)的内容都应该使用方法调用通过构建的对象图传递。

看看例如this and this回答和this博客文章。

在单个类中混合数据和行为会使测试 DI 配置变得更加困难,并且难以应用横切关注点。但除此之外,将运行时数据(例如实体)注入到服务的构造函数中会导致歧义,因为不清楚将哪个实体注入到构造函数中。以一些ICustomerService这取决于Customer实体在其构造函数中。我们应该在这里注入哪个实体,因为我们可能有数千个。尽管这可以通过在我们创建的位置实施选择标准来解决ICustomerService实现(我们的组合根),这使得 DI 配置非常复杂,使得验证配置变得非常困难,并导致应用程序中不应包含任何业务逻辑的部分产生业务逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖注入和实体框架 的相关文章

随机推荐

  • 如何使用Word宏从已打开的Excel工作簿中获取数据?

    我目前正在努力处理 vba 宏 你能帮我吗 我将非常感谢任何能在这方面帮助我的人 我想从 Word 文档宏访问 Excel 打开的工作簿的数据 由于某些原因 我需要从已在用户会话中打开的 Excel 工作簿中获取数据 而不是使用其路径在后台
  • 如何计算传递给接受可变数量参数的函数的参数数量?

    如何计算以下程序中传递给函数的参数数量 include
  • Ionic 2 - 屏幕闪光

    我有一个登录页面和一个主页 我使用本机存储来设置一个项目 该项目将检查用户是否已经登录 Facebook 或 Google 身份验证 如果该项目有一个值 此检查发生在 app componenet ts 中 它将直接导航到主页 一旦用户登录
  • 如何从Python列表中删除偶数? [复制]

    这个问题在这里已经有答案了 我正在尝试从列表中删除偶数 我的最终输出是 4 8 但它应该是空的 list 2 4 6 8 10 for i in list divid i 2 if divid 0 list remove i print l
  • 如何在路由参数中发送 URL?

    我定义了这样的路线 app gt map GET POST abc url function request response args return response gt add new CustomMiddleware 当我传递一个没
  • 当更改为使用可选链接替换快速强制展开时有什么区别?

    当调用对象实例的函数时 该对象可能不存在 可选类型 看来你总是可以在对象名称后面加上问号 而不是在对象名称后面加上感叹号 并且不会崩溃 window rootViewController containerViewController fo
  • Visual C# 中的“全局变量”

    我已经制作了 Graph 类 我想模拟一个分发网络 该图 100 有效 但是 我想在我的所有应用程序中使用相同的结构 类 例如 我有显示模拟的 Form1 但我想插入节点 例如 但我想在 Form2 中执行此操作 由于数据始终位于同一个类中
  • Flutter 构建 CI 出现错误程序类型已存在:com.google.common.util.concurrent.ListenableFuture

    在 CI CD 中构建 flutter 时出现一些错误 我使用alvrme alpine android android 29作为建设者 我尝试在本地运行它flutter build apk split per abi它运行良好 这是我的a
  • “intaccidents[5]”的声明掩盖了参数错误

    我是 C 新手 找不到任何解决此错误的方法 据我所知 我没有重载任何变量来造成命名冲突 这是我在网上可以找到的最接近原因的事情 任何帮助将非常感激 include
  • 使用 Jquery mobile 的 ListView 中的复选框

    我开始学习 HTML5 和 CSS 使用 Jquery Mobile 因为我在这个领域没有太多背景 所以我陷入了一些非常简单的事情 我想在列表视图中放置一个复选框 在每个里 我怎样才能做到这一点才能看起来像这样 http a4 mzstat
  • 在PyQt5中,如何将普通的QLineEdit(文本框)转换为完美的大写/大写QLineEdit框?

    如何转换我的QLineEdit 入门级大写或全部大写 如果我在文本框 QLineEdit 中输入字符串 它会根据用户定义的方法自动将输入字符串转换或格式化 大写或大写 import sys from PyQt5 QtWidgets impo
  • Visual Studio 初始化时状态栏中出现奇怪的图标

    当我构建项目时 Visual Studio 2015 花了很长时间 状态栏如下所示 该图标是动画的 箭头向下移动 而小盒子落入开放的正方形中 如果我不得不猜测 这意味着 VS 正在尝试下载某些东西 包 但卡在某个地方 这个图标到底是什么意思
  • 如何在 IntelliJ IDE 中将 Spark 与 Scala 项目集成?

    我正在使用 IntelliJ IDE 来玩 Scala 和 Spark 在此 IDE 中 我使用 Scala 对象创建了一个 Scala 项目 见图 我使用了示例回归代码web site 我还以非 Maven 用户身份从 GitHub 下载
  • codeigniter 默认控制器 url 路由

    我正在组建一个简单的网站 并希望 URL 的工作方式与 facebook 类似 因此通过输入 domain com username 我将获得用户个人资料 我已经可以这样做了 登录的用户个人资料位于 domain com 其他用户个人资料位
  • 如何在java中从10到1倒序打印计数?

    我想打印相反的计数顺序 我怎样才能在java中做到这一点 我尝试了一些代码但没有成功 import java util public class reversecount public static void main String arg
  • tkinter 中的标题栏菜单

    我想我们大多数人一定见过命令提示符 Windows 以及当我们打开它并单击它的图标时它会显示一个菜单 我们可以用 tkinter 做类似的事情吗 这不是正常的菜单栏 这是命令提示符之一的说明 这只是一个解决方法的示例 无需您自己进行所有窗口
  • java linkedhashmap迭代

    我有两个哈希图 LinkedHashMap
  • 如何在java应用程序中显示html?

    现在我正在致力于用 Java 实现浏览器 我需要在 JFrame 窗口内显示网站的内容 提供 url 地址 有没有一种简单的方法可以做到这一点 我尝试了JEditorPane 但它只支持HTML 3 2 所以网站的内容看起来很奇怪 Than
  • Java - 连接关闭后无法使用 ResultSet

    我在关闭与 MySQL 的连接时遇到问题 我收到错误 java sql SQLException 结果集关闭后不允许执行操作 My code public static ResultSet sqlquery String query Res
  • 依赖注入和实体框架

    我正在使用 MVVM light 及其 Ioc 来做一个 wpf 应用程序SimpleIoc 我实现了这样的存储库模式 public interface ICrud