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

Can i inject component without interface use windsor

我喜欢ioc。早些时候,我在 Java 中使用 Spring,现在,我想在 C# 中使用 DI。 我找到了 castle.windsor。但是好像不能直接注入class.

现在,我尝试了这个,但是失败了....有人,你能帮我解决一下吗?或者,告诉我,我可以使用什么 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());
        }
    }
}

Service1.cs

using System;

namespace InjectionConsole
{
    class Service1
    {
        private Service2 Service2 { get; set; }

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

            Service2.Say();
        }
    }
}

Service2.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();
        }
    }
}

我的答案与另一个相似,但有一个惊人的区别:

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 这样的容器,class 本身都会以完全相同的方式编写。 class 必须从某处 "get" 它的依赖项(Service2 的一个实例)。所以我们把它放在构造函数中。 Service1 期望创建它的任何东西都提供 Service2。由于您正在使用容器,因此容器会创建 Service1,它在构造函数中看到它需要一个 Service2,并提供它。

_service2 设为 readonly 字段强调一旦创建(构造函数完成执行)Service1 就无法进一步控制 _service2 的值。它已设置且无法更改,即使在 Service1 内也是如此。这很重要,因为我们不希望 Service1 控制 该依赖项。我们希望它 require 该依赖项。它只接受传入的任何值并使用它。

同样,这是一个令人毛骨悚然的区别。如果你 使 _service2 readonly 你可能无论如何都不会改变它。但这表明您不能更改它。

您似乎没有将 Service1Service2 类 标记为 public,这将使它们默认为内部。 Classes.FromThisAssembly() 方法仅加载 public 类型,除非您明确告诉它也加载非 public 类型(顺便说一下,这是不鼓励的!)。查看温莎城堡 GitHub 文档页面上的 the docs