C# 我可以在没有接口的情况下使用windsor注入组件吗
我喜欢国际奥委会。前面,我在Java中使用Spring,现在,我想在C#中使用DI。 我找到了温莎城堡。但它似乎并没有直接注入类 现在,我尝试这个,但失败了。。。。有人,你能帮我修一下吗?或者,告诉我,我可以使用什么DI框架 Program.csC# 我可以在没有接口的情况下使用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;
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”类型的未处理异常”哪个组件未注册?