我一直在环顾四周,了解在Android开发中使用dependency injection容器的一些信息。 具体来说,如何重写创build一个Activity的方式,也将工作时回来被杀害(不pipe什么原因)。 有没有人有这方面的经验?
我有一些SignalR集线器可能需要访问一些瞬态和单身的依赖关系。 钩住Hub的创build很容易,而且工作得很好,但是SignalR在创build的Hub上自己调用Dispose(),而不是通知依赖parsing器并让它参与处理。 如果依赖关系被注册为单身人士,这并不是什么大不了的事情,但是如果他们被注册为瞬间的话,那么他们将永远不会被处置(如果需要的话),温莎会保留他们,直到收集Windsor容器Web服务器正在closures)。 我看到几种可能的方式来处理这个… a)这里有人指出了一种方法来划分SignalR的HubDispatcher类的子类,以便它可以做适当的处理。 这不是SignalR的标准DependencyResolver的一部分,所以这可能是困难的或不可能的 b)SignalR中的其他一些类,在pipe道中的其他地方,可以重写或轻易replace,以便我们可以inheritanceHubDispatcher并确保使用子类。 从我可以告诉的是,这将是Owin中间件类HubDispatcherMiddleware。 有没有办法强制Owin不注册这个类,而是注册我自己的版本(反过来使用我自己的HubDispatcher)? c)有一些方法可以拦截由我的Hub类上的SignalR所做的Dispose()调用,以便可以将调用返回到Windsor以确保任何依赖关系正确处置并从容器中释放 d)尽量避免使用短暂的生活方式依赖,而是传入打字工厂,以便我们可以通过Hub内的打字工厂解决和释放每个依赖 目前(d)是我唯一知道该怎么做的人。 (a)或(b)将会很好。 (c)主要是由这篇文章http://kozmic.net/2010/01/27/transparently-releasing-components-in-windsor/覆盖,但是,拦截器要求通过IDisposable调用Dispose()。 SignalR的HubDispather类中枢处置的实现是 private static void DisposeHubs(IEnumerable<IHub> hubs) { foreach (var hub in hubs) { hub.Dispose(); } } 没有铸造到IDisposable那里…另外Dispose()在Hub类是虚拟的,并且博客文章暗示虚拟Dispose()可能增加一些复杂性(我不太确定多less和我不知道足够城堡的拦截器,无论是否丢失IDisposable的可以无论如何工作)。 我很欣赏我为一个相当狭隘的读者写了这个问题 – 那些使用过Windsor和SignalR的人,而不仅仅是解决依赖问题。 我发现的每个例子,包括StackOverflow上的例子,似乎都忽略了依赖关系的发布。 谢谢!
最近我正在讨论依赖倒置原理 , 控制反转和dependency injection 。 关于这个话题,我们正在辩论这些原则是否违反了OOP的一个支柱,即封装 。 我对这些事情的理解是: 依赖倒置原则意味着对象应该依赖于抽象而不是结核 – 这是实现控制反转模式和dependency injection的基本原理。 控制反转是依赖反转原理的模式实现,其中抽象依赖关系取代具体的依赖关系,允许在对象之外指定依赖关系的结构。 dependency injection是实现控制反转并提供依赖性parsing的devise模式。 当一个依赖被传递给一个依赖的组件时就会发生注入。 实质上,dependency injection模式提供了一种将依赖抽象与具体实现耦合的机制。 封装是高层对象所需要的数据和function被隔离开来并且不可访问的过程,因此程序员不知道如何实现对象。 辩论得到了一个关键点: IoC不是OOP,因为它打破封装 就我个人而言,我认为所有的OOP开发者都应该遵守依存倒置原则和控制倒置的模式,而且我的观点如下: 如果有(可能)不只一个方法去剥皮,那就不要像只有一个。 例1: class Program { void Main() { SkinCatWithKnife skinner = new SkinCatWithKnife (); skinner.SkinTheCat(); } } 这里我们看到一个封装的例子。 程序员只需要调用Main() ,猫就会被剥皮,但是如果他想要剥皮猫,比如说一组锋利的razor呢? 例2: class Program { // Encapsulation ICatSkinner skinner; public Program(ICatSkinner skinner) { // […]
我正在考虑在我们的用户界面中使用Microsoft Unity作为我的dependency injection工具。 我们的中间层已经使用温莎城堡,但我想我应该坚持微软。 有没有人有什么最好的dependency injection工具是什么想法? Autofac 城堡MicroKernel /温莎 PicoContainer.NET Puzzle.NFactory Spring.NET StructureMap Ninject 统一 简单的喷油器 NauckIT.MicroKernel WINTER4NET ObjectBuilder的
我知道类似的问题被问了几次(例如: 这里 , 这里 , 这里和这里 ),但它是以前版本的Unity,答案取决于使用的LifetimeManager类。 文档说: Unity使用从LifetimeManager基类inheritance的特定types(统称为生存期pipe理器)来控制它如何存储对对象实例的引用以及容器如何处理这些实例。 好吧,听起来不错,所以我决定在生命周期pipe理中检查构build的实现。 我的结论是: TransientLifetimeManager – 不处理处理。 容器只能parsing实例,并不会跟踪它。 调用代码负责处理实例。 ContainerControlledLifetimeManager – configuration生命期pipe理器时的实例(=configuration容器时)。 提供hiearchy中所有容器共享的单例实例。 HierarchicalLifetimeManager – 从ContainerControlledLifetimeManager派生行为。 它在hiearchy(子容器)中为每个容器提供“单例”实例。 ExternallyControlledLifetimeManager – 不处理处理。 正确的行为,因为容器不是实例的所有者。 PerResolveLifetimeManager – 不处理处理。 它通常与TransientLifetimeManager相同,但它允许在parsing整个对象图时重用dependency injection的实例。 PerThreadLifetimeManager – 不处理MSDN中描述的处理。 谁负责处理? 内置PerThreadLifetimeManager是: public class PerThreadLifetimeManager : LifetimeManager { private readonly Guid key = Guid.NewGuid(); [ThreadStatic] private static Dictionary<Guid, object> […]
我一直在寻找dependency injection并阅读一些文章。 但是我仍然无法找出MEF与其他IoC之间的区别。 所以,我的问题是这样的:我应该在哪种情况下使用MEF或IoC容器? 为什么在(WPF&Silverlight)或桌面应用程序中使用MEF for PRISM? 而在Web应用程序中,人们使用IoC容器。 那么,决定使用哪种依赖技术的标准是什么呢? 我已经通过文章http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx ,但我无法确定任何东西。
受到一个很好的问题(以及一堆很好的答案)的启发。 “对一个接口,而不是一个对象的代码”语句在Python中有什么意义吗? 我正在寻找像原始问题的答案,但与Python的片段和想法。
有没有人有很好的IoC容器的例子(最好在C#中)以及如何以及为什么使用它们? 我已经检查了wiki页面和Ayende的例子,但我还没有完全理解这个概念。 何时何地使用IoC容器?
我听到很多人说使用IoC.Resolve()是不好的做法,但是我从来没有听说过一个很好的理由(如果是testing而不是模拟容器,那么你就完成了)。 现在使用Resolve而不是Constructor Injection的优点是你不需要在构造函数中创build具有5个参数的类,并且每当你要创build该类的实例时,你都不需要提供它什么
我终于用C#围绕IoC和DI进行了包围,并且正在挣扎着一些边缘。 我正在使用Unity容器,但我认为这个问题更广泛地适用。 使用一个IoC容器来分配实现IDisposable的实例让我大吃一惊! 你怎么知道你应该Dispose()? 实例可能是为你创build的(因此你应该Dispose()它),或者它可能是一个实例的生命周期在其他地方pipe理(因此你最好不要)。 代码中没有任何内容告诉你,实际上这可能会根据configuration而改变! 这对我来说似乎是致命的。 任何IoC专家都可以描述处理这种歧义的好方法吗?