Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在没有接口的情况下使用windsor注入组件吗_C#_.net_Inversion Of Control_Castle Windsor - Fatal编程技术网

C# 我可以在没有接口的情况下使用windsor注入组件吗

C# 我可以在没有接口的情况下使用windsor注入组件吗,c#,.net,inversion-of-control,castle-windsor,C#,.net,Inversion Of Control,Castle Windsor,我喜欢国际奥委会。前面,我在Java中使用Spring,现在,我想在C#中使用DI。 我找到了温莎城堡。但它似乎并没有直接注入类 现在,我尝试这个,但失败了。。。。有人,你能帮我修一下吗?或者,告诉我,我可以使用什么DI框架 Program.cs using System; using Castle.MicroKernel.Registration; using Castle.MicroKernel.SubSystems.Configuration; using Castle.Windsor;

我喜欢国际奥委会。前面,我在Java中使用Spring,现在,我想在C#中使用DI。 我找到了温莎城堡。但它似乎并没有直接注入类

现在,我尝试这个,但失败了。。。。有人,你能帮我修一下吗?或者,告诉我,我可以使用什么DI框架

Program.cs

using System;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;

namespace InjectionConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var container = new WindsorContainer();
            container.Install(new MainInstaller());

            var service1 = container.Resolve<Service1>();

            service1.Say();

            // clean up, application exits
            container.Dispose();

            Console.ReadKey();
        }
    }

    class MainInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Classes.FromThisAssembly());
        }
    }
}
服务2.cs

using System;

namespace InjectionConsole
{
    class Service2
    {
        public void Say()
        {
            Console.WriteLine("Hello, I m Service 2");
        }
    }
}

我假设您想在Service1实例中解析Service2。您可以通过构造函数注入来实现这一点

using System;

namespace InjectionConsole
{
    class Service1
    {
        public Service1(Service2 s2) {
            this.Service2 = s2;
        }

        private Service2 Service2 { get; set; }

        public void Say()
        {
            Console.WriteLine("Hello, I m Service 1, let me call Service 2");

            Service2.Say();
        }
    }
}

我假设您想在Service1实例中解析Service2。您可以通过构造函数注入来实现这一点

using System;

namespace InjectionConsole
{
    class Service1
    {
        public Service1(Service2 s2) {
            this.Service2 = s2;
        }

        private Service2 Service2 { get; set; }

        public void Say()
        {
            Console.WriteLine("Hello, I m Service 1, let me call Service 2");

            Service2.Say();
        }
    }
}

我的回答与另一个类似,但有一个令人毛骨悚然的区别:

public class Service1
{
    private readonly Service2 _service2;

    public Service1(Service2 service2) {
        _service2 = service2;
    }

    public void Say()
    {
        Console.WriteLine("Hello, I m Service 1, let me call Service 2");

        _service2.Say();
    }
}
首先,无论您是否使用Windsor这样的容器,类本身都将以完全相同的方式编写。该类必须从某处“获取”其依赖项(Service2的实例)。所以我们把它放在构造函数中<代码>服务1期望创建它的任何东西都能提供
服务2
。因为您正在使用容器,所以容器创建了
Service1
,它在构造函数中看到它需要
Service2
,并提供了它

\u service2
设为
只读
字段强调,一旦创建了
service2(构造函数执行完毕)
Service1
就无法进一步控制
\u service2
的值。它已设置且无法更改,即使在
Service1
中也无法更改。这很重要,因为我们不希望
Service1
控制这种依赖性。我们希望它需要这种依赖性。它只接受传入的任何值并使用它


同样,这是一个令人毛骨悚然的区别。如果您不将
\u服务2
设为只读
,您可能无论如何都不会更改它。但这清楚地表明你不能改变它。

我的答案与另一个答案相似,但有一个令人毛骨悚然的区别:

public class Service1
{
    private readonly Service2 _service2;

    public Service1(Service2 service2) {
        _service2 = service2;
    }

    public void Say()
    {
        Console.WriteLine("Hello, I m Service 1, let me call Service 2");

        _service2.Say();
    }
}
首先,无论您是否使用Windsor这样的容器,类本身都将以完全相同的方式编写。该类必须从某处“获取”其依赖项(Service2的实例)。所以我们把它放在构造函数中<代码>服务1
期望创建它的任何东西都能提供
服务2
。因为您正在使用容器,所以容器创建了
Service1
,它在构造函数中看到它需要
Service2
,并提供了它

\u service2
设为
只读
字段强调,一旦创建了
service2(构造函数执行完毕)
Service1
就无法进一步控制
\u service2
的值。它已设置且无法更改,即使在
Service1
中也无法更改。这很重要,因为我们不希望
Service1
控制这种依赖性。我们希望它需要这种依赖性。它只接受传入的任何值并使用它


同样,这是一个令人毛骨悚然的区别。如果您不将
\u服务2
设为只读
,您可能无论如何都不会更改它。但是这表明您不能更改它。

似乎您没有将
Service1
Service2
类标记为
public
,这将使它们默认为内部类。
Classes.FromThisAssembly()
方法仅加载公共类型,除非您明确告诉它也加载非公共类型(顺便说一句,这是不鼓励的!)。查看castle windsor GitHub文档页面。

您似乎没有将
Service1
Service2
类标记为
public
,这将使它们默认为内部类。
Classes.FromThisAssembly()
方法仅加载公共类型,除非您明确告诉它也加载非公共类型(顺便说一句,这是不鼓励的!)。查看castle windsor GitHub文档页面。

控制反转的要点是反转依赖项,以便依赖类依赖于服务的接口,而不是实际实现。如果您不使用接口,那么您就消除了IOC容器和上述模式的核心好处。“控制反转”的要点是反转依赖项,以便依赖类依赖于服务的接口,而不是实际实现。如果您不使用接口,那么您就失去了IOC容器和上述模式的核心优势。谢谢您的回答。但失败的原因是“Castle.Windsor.dll中发生了“Castle.MicroKernel.ComponentNotFoundException”类型的未处理异常”。谢谢您的回答。但失败的原因是“Castle.Windsor.dll中发生了“Castle.MicroKernel.ComponentNotFoundException”类型的未处理异常”。谢谢您的回答。我同意你的看法。但失败的原因是“Castle.Windsor.dll中发生了“Castle.MicroKernel.ComponentNotFoundException”类型的未处理异常”哪个组件未注册?谢谢您的回答。我同意你的看法。但失败的原因是“Castle.Windsor.dll中发生了“Castle.MicroKernel.ComponentNotFoundException”类型的未处理异常”哪个组件未注册?