标签: castle-windsor

什么是温莎城堡,我为什么要关心?

我是一名长期的Windows开发人员,在win32和早期的COM上已经开始了.我从2001年开始使用.Net,因此我对C#和CLR非常流利.在我开始参与Stack Overflow之前,我从未听说过Castle Windsor.我已经读过温莎城堡"入门"指南,但它没有点击.

教这个老狗的新技巧,并告诉我为什么我应该将Castle Windsor整合到我的企业应用程序中.

c# dependency-injection castle-windsor inversion-of-control

187
推荐指数
1
解决办法
7万
查看次数

Ioc/DI - 为什么我必须在应用程序的入口点引用所有层/组件?

(与此问题相关,EF4:为什么在启用延迟加载时必须启用代理创建?).

我是DI的新手,所以请耐心等待.我知道容器负责实例化我所有已注册的类型,但为了做到这一点,它需要引用我的解决方案中的所有DLL及其引用.

如果我没有使用DI容器,我就不必在我的MVC3应用程序中引用EntityFramework库,只需引用我的业务层,它将引用我的DAL/Repo层.

我知道在一天结束时所有的DLL都包含在bin文件夹中,但我的问题是必须通过VS中的"添加引用"显式引用它,以便能够发布包含所有必需文件的WAP.

dependency-injection castle-windsor inversion-of-control

114
推荐指数
3
解决办法
2万
查看次数

为什么不使用IoC容器来解析实体/业务对象的依赖关系?

我理解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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,依赖项是Constructor Injected.现在提出几个问题.

  1. 让您的实体依赖于诸如ShipQuoter之类的外部类别是否被视为不良做法?如果我正确理解定义,消除这些依赖性似乎会导致我陷入贫血领域.

  2. 使用IoC容器来解决这些依赖关系并在需要时构建实体是不好的做法吗?是否有可能做到这一点?

感谢您的任何见解.

entities dependency-injection castle-windsor ioc-container inversion-of-control

77
推荐指数
1
解决办法
9120
查看次数

温莎 - 从容器中拉出瞬态物体

如何从容器中拉出瞬态物体?我是否必须在容器中注册它们并注入需要类的构造函数?将所有内容注入构造函数中感觉不太好.也只是为了一个类,我不想创建一个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 Logger { get; set; }

    public Record[] ProcessData(Data data)
    {
        //Data can have multiple Records
        //Loop through the data and create new set …
Run Code Online (Sandbox Code Playgroud)

.net dependency-injection castle-windsor ioc-container

57
推荐指数
1
解决办法
2万
查看次数

比较Castle Windsor,Unity和StructureMap

在跟进基耶斯洛夫的说法温莎确实比其他国际奥委会的多很多,我想了解这些国际奥委会如何叠起来反对对方,这温莎城堡带来的好处/附加设施.

有比较吗?有人可以帮助我理解Castle Windsor提供的其他IoC附加功能

structuremap dependency-injection castle-windsor ioc-container unity-container

51
推荐指数
2
解决办法
3万
查看次数

设计 - 使用Windsor时应在何处注册对象

我的应用程序中将包含以下组件

  • 数据访问
  • DataAccess.Test
  • 商业
  • Business.Test
  • 应用

我希望使用Castle Windsor作为IoC来粘合各层,但我对胶合的设计有点不确定.

我的问题是谁应该负责将物品注册到温莎?我有几个想法;

  1. 每个层都可以注册自己的对象.为了测试BL,测试平台可以为DAL注册模拟类.
  2. 每个层都可以注册其依赖项的对象,例如业务层注册数据访问层的组件.要测试BL,测试平台必须卸载"真正的"DAL对象并注册模拟对象.
  3. 应用程序(或测试应用程序)注册依赖项的所有对象.

有人可以用不同的途径帮助我提出一些想法和利弊吗?以这种方式利用Castle Windsor的示例项目的链接将非常有用.

c# castle-windsor inversion-of-control

48
推荐指数
2
解决办法
1万
查看次数

我应该使用哪种依赖注入工具?

我正在考虑在用户界面中使用Microsoft Unity作为我的依赖注入工具.

我们的中间层已经使用Castle Windsor,但我认为我应该坚持使用Microsoft.

有没有人对最好的依赖注入工具有什么想法?

.net dependency-injection castle-windsor ioc-container inversion-of-control

37
推荐指数
4
解决办法
1万
查看次数

适用于SignalR和Castle Windsor的Hub依赖生命周期管理

我有一些SignalR集线器可能需要访问一些瞬态和单独的依赖项.挂起Hub的创建很容易并且工作正常但是SignalR在创建的Hub上执行自己的Dispose()调用,而不是通知依赖解析器并让它参与处理.

如果依赖项是注册单例,这不是什么大问题,但如果它们被注册为瞬态,那么它们将永远不会被处置(如果需要的话)并且Windsor将保持它们存活直到收集Windsor容器(当无论如何,Web服务器正在关闭).

我看到几种可能的处理方法......

a)这里有人指出了一种方法来将SignalR的HubDispatcher类子类化,以便它可以进行适当的处​​理.它不是SignalR的标准DependencyResolver的一部分,所以这可能很难/不可能

b)管道中其他地方的SignalR中的其他一些类可以被覆盖或轻松替换,以便我们可以继承HubDispatcher并确保使用子类.据我所知,这将是Owin中间件类HubDispatcherMiddleware.有没有办法迫使Owin不注册这个类,而是注册我自己的版本(这又使用我自己的HubDispatcher)?

c)有一种方法可以拦截SignalR在我的Hub类上进行的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

没有转换到IDisposable那里...... Hub类上的Dispose()是虚拟的,而且博客帖子暗示虚拟Dispose()可能会增加一些复杂性(我不太确定多少,我不太了解无论如何,Castle的拦截器以及是否可以使用IDisposable进行处理.

我很欣赏我已经为一个相当狭隘的观众写了这个问题 - 那些使用过Windsor和SignalR而不仅仅是解决依赖关系的人.我发现的每个例子,包括StackOverflow上的例子,似乎都忽略了依赖关系的发布.

谢谢!

castle-windsor inversion-of-control signalr signalr-hub

36
推荐指数
1
解决办法
2952
查看次数

温莎城堡有什么缺点吗?

我一直在研究城堡项目,特别是温莎.我对这项技术的可能性印象深刻,拥有这种松散耦合系统的好处显而易见.我唯一不确定的是,如果使用这种方法有任何缺点,特别是在asp.net?例如性能命中等

我试图让这个方法的好处在这里对我的开发人员可见,并且受到以下回击的打击:

  1. 这是使用反射,每次从容器调用一个对象时,必须使用反射,因此性能会很糟糕.(这是这种情况吗?它是否在每次通话时使用反射?)

  2. 如果我依赖于接口; 如何处理具有已添加到类中的额外方法和属性的对象?(通过继承)

.net asp.net dependency-injection castle-windsor inversion-of-control

35
推荐指数
4
解决办法
7394
查看次数

Castle Windsor - 开放通用接口的IoC注册?

Castle Windsor是否允许注册开放的通用接口,还是需要单独注册每个可能的类型实例?

示例 - 下面的类型为T,Z在编译时失败,除非我单独指定强类型的T,Z.

 container.Register(Component
      .For<IAdapterFactory<T,Z>>()
      .ImplementedBy<AdapterFactory<T,Z>>()
      .LifeStyle.PerWebRequest);
Run Code Online (Sandbox Code Playgroud)

.net c# castle-windsor ioc-container inversion-of-control

35
推荐指数
1
解决办法
1万
查看次数