UnityContainer.BuildUp() - 仅当属性为空时,我可以让它将新实例注入到属性中吗?

2024-02-28

我正在反序列化这样的类

class AClass{
    [Dependency]
    AnotherClass Property{ get; set; }
}

当我使用 BuildUp() 对象时,我希望 Unity 仅在属性为 null 时创建 AnotherClass 的新实例,否则仅对其执行 BuildUp。 有没有一种简单的方法可以实现这一目标?

编辑:我正在用 wpf 做 mvvm 。这些类是视图模型,我将它们序列化,因为我想在运行之间保留一些属性,并且它们还有一些我想要统一注入的依赖项。因此,在反序列化之后,嵌套模型已经存在并设置了属性,因此我不希望 Unity 用新实例覆盖它,但我仍然希望它在其上调用 InjectionMethods 并在程序第一次运行时正常解析它,嵌套模型为空。


我最终写了一个统一扩展。 我找不到太多关于如何执行此操作的文档,所以我不太确定结果。 它似乎有效,但我有这种感觉我可能写了一些可怕的东西.. 无论如何,这是代码,欢迎改进:

public class RecursiveBuildUpContainerExtension : UnityContainerExtension {
        protected override void Initialize(){
            Context.Strategies.Add( new RecursiveBuildUpBuilderStrategy( Context.Container ), UnityBuildStage.PreCreation );
        }
    }

    public class RecursiveBuildUpBuilderStrategy : BuilderStrategy {
        readonly IUnityContainer container;
        public RecursiveBuildUpBuilderStrategy( IUnityContainer container ) {
            this.container = container;
        }

        public override void PreBuildUp( IBuilderContext context ) {

            if( context.Existing == null ) return;

            foreach( var prop in context.Existing.GetType( ).GetProperties( ) ) {

                if( ContainsType<DependencyAttribute>( prop.GetCustomAttributes( true ) ) ) {

                    if( prop.GetValue( context.Existing, null ) == null ) {
                        var value = container.Resolve( prop.PropertyType );
                        prop.GetSetMethod( ).Invoke( context.Existing, new[] { value } );
                    }
                    else {
                        var value = container.BuildUp( prop.PropertyType, prop.GetValue( context.Existing, null ) );
                        prop.GetSetMethod( ).Invoke( context.Existing, new[] { value } );
                    }
                }
            }

            foreach (var method in context.Existing.GetType().GetMethods() ){
                if( ContainsType<InjectionMethodAttribute>( method.GetCustomAttributes( true ))){
                    var argsInfo = method.GetParameters( );
                    var args = new object[argsInfo.Length];

                    for( int i = 0; i < argsInfo.Length; i++ ) {
                        args[i] = container.Resolve( argsInfo[i].ParameterType );
                    }

                    method.Invoke( context.Existing, args );
                }
            }

            context.BuildComplete = true;
        }

        private static bool ContainsType<T>( IEnumerable<object> objects ){
            foreach (var o in objects){
                if( o is T ) return true;
            }
            return false;
        }

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

UnityContainer.BuildUp() - 仅当属性为空时,我可以让它将新实例注入到属性中吗? 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 将两个元素对齐在同一行

    我正在尝试对齐两个不同的 p 同一行上的元素 我让它工作了 但它完全弄乱了我的标志 他们俩 p p 元素是您在徽标两侧看到的 TEST 对齐的代码是这样的 HTML代码 p div class container div align cen
  • php 解析错误不会显示

    我正在运行 ubuntu 10 04 nginx php fpm 5 4 如果我设置display errors On在 php ini 中 所有错误都会被打印 如果相反 我将其设置为关闭 然后使用 ini set display erro
  • ggplotly 上的主标题和 legend.position 问题

    我在如何在 ggplotly 中定位主标题和图例时遇到问题 我希望我的主标题位于图表顶部并左对齐 我还希望我的图例位于图表的底部中心 这是我的代码 library ggplot2 library dplyr library tidyr li
  • 如何更改bookdown中的图形标题格式

    使用 bookdown 单个文档 时 图会自动编号为 图 1 图标题文本 在化学中 惯例是将主要数字标记为 图1 图标题的文本 对于支持信息文件 图S1 图标题的文本 另外 在文本中的图形参考中 我们需要 如图 1 所示 所以参考文本不应该
  • Windows8 中的首选字体大小需要计算器吗?

    在查看一些官方 Windows8 Metro 材料时 我看到了这行 xaml
  • Ken Burns 效果与 nivo 滑块

    有没有人设置一个尼沃滑块 http nivo dev7studios com 平移每个图像 又名肯伯恩斯效应 http en wikipedia org wiki Ken Burns effect 我正在尝试实现它 但有点棘手 事实上 我的
  • 需要对 Docpad 持久性进行解释

    我对 Docpad 中数据持久化背后的架构感到非常困惑 从博客和论坛中 我了解到内存中 和 或输出目录 用于生成的内容 但Docpad的卖点之一是 完全基于文件 从表面上看 将其托管在 Heroku 或任何临时文件系统上似乎不合逻辑 谁能给
  • JavaScript indexOf 忽略大小写

    我正在尝试查找图像的源名称中是否包含noPic可以是大写或小写 var noPic largeSrc indexOf nopic 我应该写 var noPic largeSrc toLowerCase indexOf nopic 但这个解决
  • Django-[Errno 111]使用 smtp 时连接被拒绝

    我正在开发一个 Django 应用程序 该应用程序具有向用户发送电子邮件的功能 在测试用例中 我有一个联系表单 它使用 smtp 通过 gmail 将表单数据作为电子邮件的一部分提交 我按照建议禁用了验证码该视频播放列表 https www
  • IIS 7.5 应用程序初始化(预热)和 HTTPS

    我们已经使用 IIS 7 5 的应用程序初始化模块有一段时间了 它总是工作得很好 然而 我们刚刚开始实施 SSL 这似乎与热身产生了冲突 我已经做了很多研究 但到目前为止还没有解决方案 基本上问题是初始化模块不遵循重定向 我们必须为网站的某
  • mod_wsgi - 致命 Python 错误:initfsencoding:无法加载文件系统编解码器

    使用 Red Hat apache 2 4 6 worker mpm mod wsgi 4 6 5 和 Python 3 7 当我启动 httpd 时 出现上述错误 ModuleNotFoundError No module named e
  • Webstorm 中的 Sails.js 智能感知

    Webstorm for Sails js 应用程序有可用的智能感知吗 在我的所有控制器中 我收到模型未定义的消息 即使它工作得很好 呼叫服务也是如此 我知道这有点旧 但我最终所做的是首先使用与文件相同的名称 如类名 命名所有 module
  • 返回标识值时的 ExecuteScalar 与 ExecuteNonQuery

    试图弄清楚是否最好使用ExecuteScalar or ExecuteNonQuery如果我想返回新插入行的标识列 我读过了这个问题 https stackoverflow com questions 2974154 what is the
  • 将照片保存到 iOS 8 中的自定义相册

    我在这里需要一点帮助 我有一个方法可以将 UIImage 保存到相机胶卷中 在 iOS 8 中没有问题 该方法如下 PHPhotoLibrary sharedPhotoLibrary performChanges PHAssetChange
  • 如何在 IntelliJ 中永久启用行号?

    如何在 IntelliJ IDEA 中永久启用行号 IntelliJ 14 X 及以上版本 从14 0版本开始 设置对话框的路径略有不同 General子菜单已添加到Editor and 外貌如下所示 IntelliJ 8 1 2 13 X
  • 背景附件:已修复在 iPad 上不起作用

    是否有 CSS Modernizr 方法来了解浏览器是否支持 background attachment fixed 我同时使用背景大小和背景附件 background size cover background attachment fi
  • 在传递给 R 中 Arima() 的 xreg 参数之前,我们是否需要对外生变量进行差分?

    我正在尝试在 R 中使用 ARIMAX 构建预测模型 并需要一些关于如何在 xreg 参数中处理协变量的指导 据我了解 auto arima 函数在拟合模型 来自训练期数据 时负责协变量的差异 并且我也不需要差异协变量来生成测试期 未来值
  • JavaScript 中的 [] 是什么意思?

    在下面的javascript代码中有 被赋值为变量的值 这意味着什么 var openTollDebug 它是一个数组文字 这与声明不太一样new Array Array 对象可以在 JavaScript 中被覆盖 但数组文字不能 这是一个
  • 如何使 URLEncoding 不编码冒号?

    我有一个 JSONObject user firstname testuser surname 所以我在对象中有这些特殊字符 我对我拥有的 jsonString 进行 URLEncode urlEncodedJsonReq URLEncod
  • UnityContainer.BuildUp() - 仅当属性为空时,我可以让它将新实例注入到属性中吗?

    我正在反序列化这样的类 class AClass Dependency AnotherClass Property get set 当我使用 BuildUp 对象时 我希望 Unity 仅在属性为 null 时创建 AnotherClass