热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

依赖注入和实体框架

如何解决《依赖注入和实体框架》经验,为你挑选了1个好方法。

我正在使用MVVM灯和它的Ioc做一个wpf应用程序SimpleIoc.

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

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

 public class Crud : ICrud 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 GetAll()
        {
            using (var cOntext= new DataEntities())
            {
                DbSet dbSet = context.Set(); 
                return dbSet.AsEnumerable().ToList();
            }
        }


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

                    var cOntext= new DataEntities();
                    DbSet dbSet = context.Set();
                    return dbSet.AsEnumerable();

            });
        }
    }

在viewmodel定位器中,我注入了这样的依赖:

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

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

SimpleIoc.Default.GetInstance>().AddNew();

我需要知道 :

    如上所述的EF的实例化是否违反了依赖注入的概念

    如果是这样,我该如何解决这个问题?

Steven.. 5

你不应该注入实体.实体不是服务.使用依赖注入构建的对象图应仅由服务组成.任何包含运行时数据(实体,消息,DTO)的东西都应该使用方法调用通过构建的对象图传递.

看看这个以及这个答案和这篇博文的例子.

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



1> Steven..:

你不应该注入实体.实体不是服务.使用依赖注入构建的对象图应仅由服务组成.任何包含运行时数据(实体,消息,DTO)的东西都应该使用方法调用通过构建的对象图传递.

看看这个以及这个答案和这篇博文的例子.

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


推荐阅读
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了在C#中SByte类型的GetHashCode方法,该方法用于获取当前SByte实例的HashCode。给出了该方法的语法和返回值,并提供了一个示例程序演示了该方法的使用。 ... [详细]
  • 本文介绍了如何使用OpenXML按页码访问文档内容,以及在处理分页符和XML元素时的一些挑战。同时,还讨论了基于页面的引用框架的局限性和超越基于页面的引用框架的方法。最后,给出了一个使用C#的示例代码来按页码访问OpenXML内容的方法。 ... [详细]
author-avatar
手机用户2502897397
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有