Unity Application Block 1.0系列(6):杜绝循环引用

在介绍 Constructor Injection、Property Injection和 Method Call Injection时,都有特别提到不要出现循环引用(Circular References),因为出现这种问题后很难去检测到。最好的解决方法是写代码时候尽量避免出现这种情况。

下面看看循环引用的几个场景,在使用依赖注入框架时应该尽量避免出现这样的情况:

1.通过Constructor Injection生成的对象在构造器的参数中互相引用

public class Class1{    public Class1(Class2 test2)    {       ...    }}public class Class2{    public Class2(Class1 test1)      {       ...    }}

通过Unity容器装载Class1时,会做Constructor Injection,由于Class1依赖于Class2,所以会先去装载Class2。在装载Class2时同样也会做Constructor Injection,由于Class2又依赖于Class1,所以会再去装载Class1......这样一直持续装载下去,就成了一个死循环,跳不出来。

2. 通过Constructor Injection生成的对象作为自身构造器的参数

直接看例子:

public class Class1{    public Class1(Class1 test1)  { ... }}

3. 通过method call injection生成的对象互相引用

直接看例子:

public class Class1{    [InjectionMethod]    public void Method1()    {        Method2();    }    [InjectionMethod]    public void Method2()    {        Method1();    }}

4.通过property(setter) injection生成的对象互相引用

直接看例子:

public class Class1{    [Dependency]    public string Propert1    {        get        {            return Propert2;        }    }    [Dependency]    public string Propert2    {        get        {            return Propert1;        }    }}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索inject
, 循环引用
, public
, 构造器
, constructor
, 生成
, Injection
, 循环生成
装载
unity application、unity3d application、unity5 application、application、common application,以便于您获取更多的相关知识。

时间: 2025-01-24 09:48:53

Unity Application Block 1.0系列(6):杜绝循环引用的相关文章

Unity Application Block 1.0系列(1):快速开始

Unity Application Block (Unity) 是微软 Patterns & Practices 团队开发的一个轻量级.可扩展的依赖注入容器,有助于构建松散耦合的系统.它支持构造子注入 (Constructor Injection) , 属性/设值方法注入 (Property/Setter Injection) 和方法调用注入 (Method Call Injection) .Patterns & Practices 团队于前些天(4月4日)发布了Unity的第一个正式版本

Unity Application Block 1.0系列(7):Lifetime Managers

Unity使用继承于 LifetimeManager 基类的类去控制怎样存放到对象实例的引用和容器怎样销毁这些实例,也就是说Unity基于具体的Lifetime Manager 类去管理对象的创建和销毁. 目前Unity中提供两个Lifetime Manager类可供我们直接使用,当然你也可以实现自己的Lifetime Manager类. 1. ContainerControlledLifetimeManager Unity保存一个指向对象实例的引用.通过Unity容器为同一个类型或对象获取对象

Unity Application Block 1.0系列(5): 使用BuildUp让已存在对象实例也支持依

通过Unity容器的BuildUp方法可以让已存在的对象实例也可以支持依赖注入. 准备工作 先看一些类,下面会用到: public class Owner{ public string Name { get { return "Inrie"; } } public int Age { get { return 24; } }}public abstract class Player{ public abstract void Play(); public abstract string

Unity Application Block 1.0系列(4):方法调用注入(Method Call Injection)

什么情况下使用Method CallInjection 当实例化父对象时也能自动实例化所依赖的对象 通过简单的方式使得很容易做到在代码中查看每个类所依赖的项 父对象有很多相互之间有关联关系的构造器,导致在调试和维护时很不方便 父对象包含有很多参数构造器,特别是参数类型相似的只能通过参数的位置来辨别的 隐藏依赖的对象,不作为属性暴露出去 通过修改依赖对象的代码来控制哪些对象可以被注入,而不用改动父对象或应用程序 准备工作 public interface IPlayer { void Play()

Unity Application Block 1.0系列(3):属性/设值方法注入(Property/Setter Inj

什么情况下使用Property (Setter) Injection 当实例化父对象时也能自动实例化所依赖的对象 通过简单的方式使得很容易做到在代码中查看每个类所依赖的项 父对象有很多相互之间有关联关系的构造器,导致在调试和维护时很不方便. 父对象包含有很多参数构造器,特别是参数类型相似的只能通过参数的位置来辨别的 让用户(将调用这些代码的程序)更方便的看到有哪些对象可以用,这在Constructor Injection里是没办法实现的. 通过修改依赖对象的代码来控制哪些对象可以被注入,而不用改

Unity Application Block 1.0系列(2):构造子注入(Constructor Injection)

什么情况下使用Constructor Injection 当实例化父对象时也能自动实例化所依赖的对象 通过简单的方式使得很容易做到在代码中查看每个类所依赖的项 父对象的构造器不需要很多相互间有关联关系的构造器 父对象的构造器不需要很多参数 通过不使用属性和方法暴露给调用程序,达到封装字段值以不能被看到的目的 通过修改依赖对象的代码来控制哪些对象可以被注入,而不用改动父对象或应用程序 准备工作 public class Song { public string Singer { get { ret

Unity Application Block 1.2 学习笔记

昨天花了一天时间,把IOC/DI的相关文章以及Unity相关的一些文章基本在园子里搜了个遍 先给出几篇不错的文章链接: Unity Application Block官方网址 http://www.codeplex.com/unity 吕震宇整理的[Object Builder Application Block] http://www.cnblogs.com/zhenyulu/articles/641728.html 吕震宇[你真的了解Ioc与AOP吗?] http://www.cnblogs

一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《添加引用对话框的改进》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发

艾伟_转载:VS 2010 和 .NET 4.0 系列之《添加引用对话框的改进》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发