Tag: ioc container

装饰者和IDisposable

我有一个DbContext的子类 public class MyContext : DbContext { } 我在IUnitOfWork周围有一个IUnitOfWork抽象,它实现了IDisposable以确保在适当的时候处理诸如MyContext类的引用 public interface IUnitOfWork : IDisposable { } public class UnitOfWork : IUnitOfWork { private readonly MyContext _context; public UnitOfWork() { _context = new MyContext(); } ~UnitOfWork() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private bool _disposed; protected virtual void Dispose(bool disposing) { if […]

使用Unity与最小配置

在工作中,我们使用Unity很多。 它的function非常棒,但您使用的越多,配置文件越多,运行时问题就越多,您为每个测试项目重新创建统一配置的次数就越多。 所以我们最终得到一个巨大的统一配置部分,必须在几个项目中复制,当需要部署时,你最终必须追踪你忘记添加引用的dll,但是你只能在运行时发现它们。 不好玩。 我猜测有人遇到过这个问题而且有一个解决方案。 理想情况下,我想弄清楚如何以一种使用约定优于配置的方式配置Unity并减少运行时问题(即,巨大的配置文件)。 有人知道用最小配置实现Unity的好方法吗? 编辑:有一点:我必须坚持只使用Unity。 无法真正切换到Ninject等

DI / IoC容器性能基准比较?

我在这里找到了一些用于测试几个顶级.NET DI / IoC容器性能的2008年基准测试结果。 但我无法找到任何更新的结果。 是否有任何基准测试可以比较一些大的IoC容器(StructureMap,Unity,Ninject,Autofac,Castle Windsor等)?

IoC – 多个实现支持单个接口

我想知道为什么.Net IoC容器不能轻易支持单个接口的多个实现! 可能是我错了,但就我所见,像Ninject这样的框架部分支持使用注释这个function( 如何? )。 我不认为像Windsor或简单注入器这样的其他框架有一个简单的机制来支持这种情况。 是否有任何理由不支持许多框架? AFAIK,使用接口的最重要原因之一是实现松散耦合。 如果框架旨在改善松耦合,不能流利地支持单个接口的多个实现,我不明白为什么! PS当然我理解在运行时会出现解决问题,容器会混淆选择哪种实现,但这是设计中必须考虑的事情,对吧?

Unity Application Block,如何将参数传递给Injection Factory?

这就是我现在所拥有的 Container.RegisterType(); Container.RegisterType( new InjectionFactory( (c) => c.Resolve().GetUser(“John”))); 得到它 Container.Resolve(); 我想将一个名称作为参数传递给Factory,以便我能够用名称解析用户对象; 像这样的东西: Container.Resolve(“Jonh”); 如何更改此案例的类型注册?

MEF =可能会遇到挫折感?

UPDATE 因为我试图在我的应用程序中使MEF工作,所以我遇到了更多的地方,我只是不明白为什么它不会在我期望的时候自动创建我的库。 我想这一切都回到了里德所说的关于需要MEF来创造一切的东西。 所以现在,我有一个XML阅读器类需要使用我的CandySettings,但即使它的ICandySettings属性具有[Import]属性,它也不会被导入。 首先我发现[导入]不适用于静力学,所以我改变了这一点。 但在那之后它仍然无效。 我认为这是因为我手动创建XML阅读器对象,而MEF要我做的是[导入] XML阅读器…这意味着我现在必须有一个接口。 这几乎就像使用IoC(或至少用于MEF),这是一个全有或全无的事情。 你不能随便随意使用它,因为最终你想要注入属性的类也需要由MEF创建。 如果我错了请纠正我! 原帖 嗯,这还不错。 :)但是在Reed指出MEF作为IoC的潜在替代品之后我确实有问题(到目前为止看起来确实很不错)。 请考虑以下模型: alt text http://bit.ly/9W0sHt 正如你所看到的,我有一个应用程序,这个应用程序使用插件(哎呀,错过了那个关联!)。 App和Plugins都需要使用CandySettings类型的对象,这可以在另一个程序集中找到。 我首先尝试在MEF中使用ComposeParts方法,但我能让它工作的唯一方法是在插件代码中执行类似的操作。 var container = new CompositionContainer(); container.ComposeParts(this, new CandySettings()); 但这没有任何意义,因为我为什么要在插件中创建CandySettings实例? 它应该在App中。 但是如果我把它放在App代码中,那么即使我在插件中使用[Import]和在CandySettings中使用[Export],插件也不会神奇地弄清楚如何获得ICandySettings。 编辑 (可能是因为我应该从应用程序调用ComposeParts()然后传递它的插件?) 我这样做的方法是使用MEF的DirectoryCatalog ,因为这允许插件在构造时扫描当前文件夹中的所有程序集并自动导入用[Import]属性标记的所有内容。 所以它看起来像这样,并且可能在每个插件中: var catalog = new DirectoryCatalog(“.”); var container = new CompositionContainer(catalog); container.ComposeParts(this); 这完全有效,但我不禁认为这不是MEF的用途吗?

统一解析同一类型的多个实例

我想做一个简单的多种类型注册的解决方案(最终注入构造函数,但使用.Resolve来查看Unity是否能够执行此类操作。 在下面的每种情况下,Unity都会解析0应该解析的项目2。 是否有一些统一的转变可以打开2007年后的行为? 或者我只是大错特错了? 这是我的代码: public interface IFoo {} public class Foo1 : IFoo{} public class Foo2 : IFoo{} class Program { static void Main(string[] args) { var container = new UnityContainer(); container.RegisterType(); container.RegisterType(); // container.Resolve<IEnumerable>(); returns 0 // container.ResolveAll(); returns 0 var foos = container.Resolve(); Console.WriteLine(foos.Count()); Console.ReadLine(); } }

不了解在系统架构中创建IoC容器的位置

假设我有以下4个.net程序集: Winforms UI 商业逻辑 SQL Server数据访问(实现IRepository) 通用接口(IRepository等的定义) 我的业务逻辑(2)使用构造函数dependency injection通过IRepository(在4中定义)调用数据访问层(3)。 但是,当我停止业务对象时,我需要传入一个实际的存储库。 我通过在业务逻辑层中使用单例类返回实现IRepository的当前使用的具体对象来实现此目的。 我得出的结论是,这是一件坏事,因为我的业务逻辑层现在必须引用3和4。 我想我需要一个IoC容器,但问题是我在哪里创建/放置它似乎无论我在哪里创建它(1-UI)? 还需要保存对3(SQL Server数据访问)的引用。 我不是只是解决问题而不是实现实际的脱钩吗? 我是否在UI中创建IoC容器。 或者通过另一个新组件暴露它。 (我正在使用C#,。net 3.5和AutoFac) 谢谢。

Silverlight构造函数注入视图模型+设计模式

我试图在Silverlight 4中编写可测试的ViewModel。我正在使用MVVM灯。 我使用AutoFac和IoCContainer正在完成它的工作。 但是要注入ViewModel的构造函数,它绑定到Views我有这个构造函数链接: public UserViewModel() : this(IoCContainer.Resolve()) { } public UserViewModel(IUserServiceAsync userService) { if (this.IsInDesignMode) return; _userService = userService; } 哪个不干净,但是到目前为止我找到的最佳选择。 这是有效的,我的应用程序可以根据需要工作,并且可以通过控制倒置来测试 但是,我的VM绑定到我的视图,如下所示: 在我的XAML页面属性中,VS2010和Blend中的设计模式都不起作用。 是否有更好的方法来实现我在Silverlight中尝试仍然适用于设计模式的东西? 失去设计模式不是一个交易破坏者,但在学习XAML时会很方便。 一个更干净的无链接方式会很好! 我认为可以使用AutoFac / IoC将视图模型解析为视图,就像上面的XAML标记方法一样,并沿着这条路走下去? 谢谢。

使用Castle Windsor在基类中注入原始属性

我有以下接口定义: public interface ICommandHandler { ILogger Logger { get; set; } bool SendAsync { get; set; } } 我有多个实现ICommandHandler实现,需要解决。 当Castle Windows自动注入Logger属性时,当注入ILogger时,我无法找到一种方法来配置在创建新实例期间Windsor将SendAsync属性设置为true。 UPDATE 命令处理程序实现从基接口inheritance的通用接口: public interface ICommandHandler : ICommandHandler where TCommand : Command { void Handle(TCommand command); } 这是我的配置: var container = new WindsorContainer(); container.Register(Component .For<ICommandHandler>() .ImplementedBy()); container.Register(Component .For<ICommandHandler>() .ImplementedBy()); container.Register(Component .For<ICommandHandler>() .ImplementedBy()); Castle Windsor有什么方法可以做到这一点?