我有一些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上的例子,似乎都忽略了依赖关系的发布。 谢谢!
我正在考虑在我们的用户界面中使用Microsoft Unity作为我的dependency injection工具。 我们的中间层已经使用温莎城堡,但我想我应该坚持微软。 有没有人有什么最好的dependency injection工具是什么想法? Autofac 城堡MicroKernel /温莎 PicoContainer.NET Puzzle.NFactory Spring.NET StructureMap Ninject 统一 简单的喷油器 NauckIT.MicroKernel WINTER4NET ObjectBuilder的
在跟随Krzysztof的声明 , 温莎做了比其他IoC更多,我想了解这些IoC的相互堆叠和城堡温莎提供的好处/额外设施。 有比较吗? 有人可以帮助我了解Castle Windsor提供的其他IoCfunction吗?
我了解DI背后的概念,但我只是了解不同的IoC容器可以做什么。 似乎大多数人主张使用IoC容器来连接无状态服务,但是如何将它们用于实体这样的有状态对象呢? 无论是对还是错,我通常都会对自己的实体进行行为,即使这种行为需要外部的类。 例: public class Order : IOrder { private string _ShipAddress; private IShipQuoter _ShipQuoter; public Order(IOrderData OrderData, IShipQuoter ShipQuoter) { // OrderData comes from a repository and has the data needed // to construct order _ShipAddress = OrderData.ShipAddress; // etc. _ShipQuoter = ShipQuoter; } private decimal GetShippingRate() { return _ShipQuoter.GetRate(this); } } 正如你所看到的,依赖关系是注入构造函数。 […]
我怎样才能从容器中取出瞬态的物体呢? 我是否需要在容器中注册它们并注入需要的类的构造函数? 将所有内容注入构造函数并不好。 也只是对于一个类,我不想创建一个TypedFactory ,并将工厂注入需要的类。 另一个想到我的是在需要的基础上“新”起来的。 但我也注入Logger组件(通过属性)到我所有的类。 所以,如果我新建它们,我将不得不在这些类中手动实例化Logger 。 我怎样才能继续使用容器为我所有的课程? 记录器注入:除非存在继承链(在这种情况下,只有基类具有此属性,并且所有派生类都使用该属性),否则大多数类都定义了Logger属性。 当这些通过Windsor容器实例化时,他们会得到我注入ILogger实现。 //Install QueueMonitor as Singleton Container.Register(Component.For<QueueMonitor>().LifestyleSingleton()); //Install DataProcessor as Trnsient Container.Register(Component.For<DataProcessor>().LifestyleTransient()); Container.Register(Component.For<Data>().LifestyleScoped()); public class QueueMonitor { private dataProcessor; public ILogger Logger { get; set; } public void OnDataReceived(Data data) { //pull the dataProcessor from factory dataProcessor.ProcessData(data); } } public class DataProcessor { public ILogger […]