在使用Castle Windsor的IWindsorContainer时,我是否应该从项目中删除IKernel?

时间:2014-01-08 16:58:59

标签: dependency-injection asp.net-web-api inversion-of-control castle-windsor ioc-container

基于此声明:

Castle Project IoC容器有两种版本。 MicroKernel是一个轻量级容器,提供IoC和DI的核心功能。 Windsor Container,构建于MicroKernel之上,通过添加对外部配置和拦截器的支持来扩展其功能。大多数时候你最终会使用Windsor,但为了简单起见,我将首先说明如何使用MicroKernel实现IoC和DI。

...在this article中(BTW,这是我发现的最好的文章,用于理解IoC / DI和Castle.Windsor)...我想我应该删除此代码我的项目:

private readonly IKernel _kernel;

public WindsorControllerFactory(IKernel kernel)
{
    _kernel = kernel; 
    // Don't know what to do with the kernel, yet
}

...因为我也有这个:

public class WindsorCompositionRoot : IHttpControllerActivator
{
    private readonly IWindsorContainer container;

    public WindsorCompositionRoot(IWindsorContainer container)
    {
        this.container = container;
    }

我是对的(我应该判断内核是否合适)?

更新

显然我应该 86内核,因为上面提到的文章的示例项目有:

//#define USE_KERNEL

. . .

#if USE_KERNEL

        private static void Main()
        {
            IKernel kernel = new DefaultKernel();

            kernel.AddComponent("HttpFileDownloader", typeof(IFileDownloader), typeof(HttpFileDownloader));
            kernel.AddComponent("StringParsingTitleScraper", typeof(ITitleScraper), typeof(StringParsingTitleScraper));
            kernel.AddComponent("HtmlTitleRetriever", typeof(HtmlTitleRetriever));

            HtmlTitleRetriever retriever = (HtmlTitleRetriever) kernel[typeof(HtmlTitleRetriever)];

            Console.WriteLine(retriever.GetTitle(new Uri(ConfigurationManager.AppSettings["fileUri"])));

            kernel.ReleaseComponent(retriever);
        }
#else

1 个答案:

答案 0 :(得分:1)

IKernel足以满足ControllerFactory的需求。依靠较少的细节是一种很好的设计实践。