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

C#学习教程:C#/Unity中的构造函数注入?分享

C#Unity中的构造函数注入?我正在使用C#和Microsoft的Unity框架。我不太清楚如何解决这个问题。这可能与我对Unity缺乏理解DI有关。我可以使用以下示例代码总结我

C#/ Unity中的构造函数注入?

我正在使用C#和Microsoft的Unity框架。 我不太清楚如何解决这个问题。 这可能与我对Unity缺乏理解DI有关。

我可以使用以下示例代码总结我的问题:

class Train(Person p) { ... } class Bus(Person p) { ... } class Person(string name) { ... } Person dad = new Person("joe"); Person son = new Person("timmy"); 

当我在Bus上调用resolve方法时,如何确保注入名为’timmy’的Person’son’并在解析Train时如何确定具有当时名称’joe’的Person’add’得到解决?

我想也许可以使用命名实例? 但我不知所措。 任何帮助,将不胜感激。

顺便说一句,我宁愿不创建一个IPerson接口。

解决此问题的一种方法是使用具有命名注册的注入构造函数。

 // Register timmy this way Person son = new Person("Timmy"); container.RegisterInstance("son", son); // OR register timmy this way container.RegisterType("son", new InjectionConstructor("Timmy")); // Either way, register bus this way. container.RegisterType(new InjectionConstructor(container.Resolve("son"))); // Repeat for Joe / Train 

除非您分别将“joe”和“timmy”注册为命名依赖项,否则您无法确定将“timmy”注入Schoolbus。 实际上,如果您尝试将同一个类的两个实例注册为未命名的依赖项,则您将具有不明确的设置,并且您根本无法解析Person

一般来说,如果你必须注册很多命名实例,你可能会以错误的方式进行DI。 DI的主要思想是解析域服务而不是域对象

DI的主要思想是提供一种机制,允许您将抽象类型 (接口或抽象类)解析为具体类型 。 你的例子没有抽象类型,所以它没有多大意义。

马克·西曼说得对。 我同情你的困惑。 当我学会使用自动dependency injection容器时,我自己完成了它。 问题是有许多有效和合理的方法来设计和使用对象。 然而,只有其中一些方法适用于自动依赖性注入容器。

我的个人历史:在我学会如何使用Inversion of Control容器(如Unity或Castle Windsor容器)之前,我学习了对象构造和控制反转的OO原则。 我养成了编写这样代码的习惯:

 public class Foo { IService _service; int _accountNumber; public Foo(IService service, int accountNumber) { _service = service; _accountNumber = accountNumber; } public void SaveAccount() { _service.Save(_accountNumber); } } public class Program { public static void Main() { Foo foo = new Foo(new Service(),1234); foo.Save(); } } 

在这个设计中,我的Foo类负责将帐户保存到数据库。 它需要一个帐号来执行此操作,并需要一项服务来执行脏工作。 这有点类似于上面提供的混凝土类,其中每个对象在构造函数中采用一些唯一值。 当您使用自己的代码实例化对象时,这很好。 您可以在合适的时间传递适当的值。

但是,当我了解自动dependency injection容器时,我发现我不再手动实例化Foo。 容器会为我实例化构造函数参数。 这对IService等服务来说非常方便。 但它显然不适用于整数和字符串之类的东西。 在这些情况下,它将提供默认值(如整数为零)。 相反,我习惯于传递特定于上下文的值,如帐号,姓名等……所以我必须调整我的编码和设计风格,如下所示:

 public class Foo { IService _service; public Foo(IService service) { _service = service; } public void SaveAccount(int accountNumber) { _service.Save(accountNumber); } } public class Program { public static void Main() { Foo foo = new Foo(new Service()); foo.Save(1234); } } 

似乎两个Foo类都是有效的设计。 但第二个可用于自动dependency injection,而第一个则不然。

上述就是C#学习教程:C#/ Unity中的构造函数注入?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
author-avatar
栋哥0822_893
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有