我可以在没有接口的情况下使用 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
你可能无论如何都不会改变它。但这表明您不能更改它。
您似乎没有将 Service1
和 Service2
类 标记为 public
,这将使它们默认为内部。 Classes.FromThisAssembly()
方法仅加载 public 类型,除非您明确告诉它也加载非 public 类型(顺便说一下,这是不鼓励的!)。查看温莎城堡 GitHub 文档页面上的 the docs。
我喜欢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
你可能无论如何都不会改变它。但这表明您不能更改它。
您似乎没有将 Service1
和 Service2
类 标记为 public
,这将使它们默认为内部。 Classes.FromThisAssembly()
方法仅加载 public 类型,除非您明确告诉它也加载非 public 类型(顺便说一下,这是不鼓励的!)。查看温莎城堡 GitHub 文档页面上的 the docs。