Tag: 反转控制

.NET Framework中的控制和dependency injection反转

是否有任何特定的DI示例/实例作为.NET Framework本身的架构原则或设计模式应用? 框架/ BCL中的任何(或许多)类型是否符合IoC? 基于C#的类型名称和简要说明/解释会很棒! 这将使DI注入设计原则成为最佳实践的必要性……因为它是从基础框架本身收集的。 我重申,我不是在为框架中的IoC / DI寻找IoC / DI框架。 编辑:只是想得到更多的实例/例子…因此赏金!

JavaScript DI / IoC等同于静态类型语言的标准DI模式

.NET和Java都有大量的DI / IoC容器可供它们使用,每个容器都有许多模式,我发现这些模式在处理它们的各个方面非常有用。 我现在正想在JavaScript中做同等的事情。 由于JavaScript是一种动态语言,我不希望DI / IoC容器直接等同于静态类型语言中容器提供的所有function,因此欢迎使用这些模式的替代方案。 我还希望JavaScript中提供的DI / IoC容器的function会有所不同,因此对不同容器的引用非常受欢迎。 以下模式是Autofac 3支持的模式 ,我认为这些模式适用于动态语言。 有关这些模式和关系的一般信息,请参阅http://autofac.readthedocs.org/en/latest/resolve/relationships.html和http://nblumhardt.com/2010/01/the-relationship-zoo/ 。 以下概念中的大多数(如果不是全部)也可以使用其他语言和DI / IoC容器,例如Google Guice和Spring 。 与JavaScript中下面描述的概念和模式最接近的等价物是什么? 一般概念 概念1:向IoC容器注册 在IoC容器可以创建类型的实例之前,它需要知道类型。 这是通过注册完成的。 注册通常以声明方式完成: class A {} var builder = new ContainerBuilder(); builder.RegisterType(); 上面使IoC容器知道类型A.它通过reflection发现A的依赖性。 注册也可以通过充当工厂的function进行。 这些函数通常是lambdas,可以内联编写: class B {} class A { A(string name, B b) { } } builder.RegisterType(); builder.Register(c => // […]

如何避免服务定位器模式? 我是不是该?

我正在开发一个WinForms系统(我知道),在创建表单时有很多Constructor Injection ,但如果这些表单/视图需要打开另一个表单,我发现DI容器已经注入,以便我们可以找到在运行时实现所需的视图接口。 例如 public partial class MyView : Form, IMyView { private readonly IDIContainer _container; public MyView(IDIContainer container) { InitializeComponent(); _container = container; } public OpenDialogClick(object sender, EventArgs e) { var dialog = container.Resolve(); dialog.ShowDialog(this); } } 我知道这基本上是使用容器作为服务定位器。 我一再被告知这被认为是一种反模式,所以我想避免这种用法。 我可以将视图作为构造函数的一部分注入,如下所示: public partial class MyView : Form, IMyView { private readonly IDialogView _dialog; public MyView(IDialogView […]

如何将Unity与内部类一起使用?

我有一个Web API应用程序,并使用Unity进行dependency injection。 该应用程序使用包含Interface IDoStuff的库和实现该接口的类: internal interface IDoStuff { void DoSomething(); } internal class DoStuff : IDoStuff { public void DoSomething() { // Do some stuff } } 该库还有一个需要做的事情的公共类: public class NeedToDoStuff { private IDoStuff doStuff; public NeedToDoStuff() { this.doStuff = new DoStuff(); } internal NeedToDoStuff(IDoStuff doStuff) { this.doStuff = doStuff; } void PleaseDoStuff() { […]

IOC DImultithreading生命周期范围在后台任务中

我有一个使用IOC和DI来创建和注入服务的应用程序。 我有一个处理一些业务逻辑的服务层,在服务层我有一个与数据库通信的存储库。 该存储库使用的是非线程安全的DataContext。 我想使用后台任务异步运行服务上的一些函数,但是知道这会导致存储库出现问题。 因此,我希望为每个创建的后台线程创建存储库。 这是如何实现的? 我正在使用StructureMap作为IoC。 public class Service : IService { IRepository _repository; public Service(IRepository repository) { this._repository = repository; } public void DoSomething() { // Do Work _repository.Save(); } } public class Controller { IService _service; public Controller(IService service) { this._service = service; } public Action DoSomethingManyTimes() { for(int i =0; i […]

注入应用程序配置的最佳方式

好吧,我正在进入这个梦幻般的网站,并提出了将配置设置注入应用程序组件的正确方法的问题。 因此,概述是:我有一个用C#.Net 3.5编写的应用程序。 它由3个程序集组成 – 核心,数据和服务。 数据和服务程序集需要从app.config检索的设置,这可以通过设置文件完成,例如。 代码: public static String RequestQueueConnectionString { get { return ConnectionSettings.Default.RequestQueueConnectionString; } } 配置: … 现在,程序集都是使用StructureMap for IoC设置的 – 我认为应该提供我正在寻找的答案,但我只是看不到它! IoC: public static void ConfigureStructureMap(IContainer container) { container.Configure(x => … … 我想要做的是注入已填充到IoC容器中的配置类,以便这些设置用于该程序集,而不是设置文件/ app.config中指定的那些。 所以也许: public static void ConfigureStructureMap(IContainer container, MyConfigClass config) { container.Configure(x => x.For() .Singleton() .Use ??? … […]

dependency injection:如何通过注射容器?

(这个问题不依赖于特定的IoC框架,因此我的示例中的接口和类型是元类型。只需用适合您喜欢的IoC框架的类型替换它们。) 在我的主要方法中,我通常设置我的容器做这样的事情: static void Main() { IInjector in = new Injector(); in.Register().For(); in.Register<IOtherType().For(); … // Run actual application App app = in.Resolve(); app.Run(); } 我的问题是,你是如何得到注射器的? 我通常只是自己注册了注射器,并注入了自己注射的类型,但我不确定这是否是正确的“模式”。

什么是.NET中的IoC

可能重复: 什么是控制倒置? 我不熟悉控制反转(IoC)。 什么是IoC以及应用程序如何从使用IOC中受益。 如何在.NET中使用C#实现?

找到.NET库的正确组合根

我在这里看到了关于这个论点的各种其他问题,最值得注意的是 dependency injection(DI)“友好”库 Ioc / DI – 为什么我必须在输入应用程序中引用所有层/组件? 和这篇文章 (和其他各种材料)。 但是,我不清楚将组合根放在库(DLL).NET项目中的哪个位置。 该项目不属于本文中提到的任何特定类型。 在桌面,控制台甚至Web应用程序中,这一点都是明确定义的。 我目前的方法是包装容器,注册类型并重新公开Resolve方法: class DefaultBootstrapper : IBootstrapper { public Bootstrapper() { _container = new XXXContainer(); RegisterTypes(_container); } public T Resolve() where T : class { return _container.Resolve(); } // + other _container.Resolve() overloads private readonly XXXContainer _container; } 然后我阻止库消费者创建库的根实例 (例如,定义内部构造函数),从而强制使用单例工厂: class XYZFactory { static […]

嘲笑’System.Console’的行为

是否有一种标准方法可以通过对接口而不是System.Console进行编程来使C#控制台应用程序单元可测试? 例如,使用IConsole界面? 你做过这个,你用过什么样的方法? 您是否公开了应用程序需要写入标准输出的事件?