我喜欢ioc。以前,我在Java中使用Spring,现在,我想在C#中使用DI。我找到了Castle.windsor。但是它似乎没有直接注射类。
现在,我尝试此方法,但是失败了……。有人,您可以帮我解决这个问题吗?或者,告诉我,我可以使用什么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");
}
}
}
我的答案与另一个类似,但有一个区别:
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
从某处“获取”其依赖项(的一个实例)。因此,我们将其放入构造函数中。Service1
期望任何创造它的东西都能提供一个Service2
。由于您使用的是容器,因此容器会创建Service1
,它会在构造函数中看到需要Service2
,并提供。
制作字段强调的是,一旦创建_service2
了readonly
字段(构造函数完成执行)Service1
,便无法进一步控制的值_service2
。它已设置且无法更改,即使在中也无法更改Service1
。这是因为我们不希望是非常重要的Service1
,以控制这种依赖性。我们希望它需要这种依赖性。它只接受传入的任何值并使用它。
再次,那是分裂头发的区别。如果你没有做_service2
readonly
你可能不会无论如何改变它。但这清楚地表明您无法更改它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句