我们在配置文件中声明了许多城堡温莎组件。
深入内部的某些组件可能需要其他组件的服务。
问题是当应用程序正在关闭并且容器正在处置时。在Startable / Disposable组件(A)的Dispose()/ Stop()期间,当它需要某些其他组件(B)的服务时,然后引发ComponentNotFoundException。到那时,B已从容器中移出。
我注意到,应用程序配置文件中组件声明的顺序很重要。而重新分配A和B解决了这个问题。
有没有更好的方法来影响组件的放置顺序?
编辑:
根据注释中的请求,我在此处提供将抛出ComponentNotFoundException的示例代码:
class Program
{
static void Main()
{
IoC.Resolve<ICriticalService>().DoStuff();
IoC.Resolve<IEmailService>().SendEmail("Blah");
IoC.Clear();
}
}
internal class CriticalService : ICriticalService, IStartable
{
public void Start()
{}
public void Stop()
{
// Should throw ComponentNotFoundException, as EmailService is already disposed and removed from the container
IoC.Resolve<IEmailService>().SendEmail("Stopping");
}
public void DoStuff()
{}
}
internal class EmailService : IEmailService
{
public void SendEmail(string message)
{
Console.WriteLine(message);
}
public void Dispose()
{
Console.WriteLine("EmailService Disposed.");
GC.SuppressFinalize(this);
}
}
internal interface ICriticalService
{
void DoStuff();
}
internal interface IEmailService : IDisposable
{
void SendEmail(string message);
}
public static class IoC
{
private static readonly IWindsorContainer _container = new WindsorContainer(new XmlInterpreter());
static IoC()
{
_container.AddFacility<StartableFacility>();
// Swapping the following 2 lines resolves the problem
_container.AddComponent<ICriticalService, CriticalService>();
_container.AddComponent<IEmailService, EmailService>();
}
public static void Clear()
{
_container.Dispose();
}
public static T Resolve<T>()
{
return (T)_container[typeof(T)];
}
}
注意:请参见代码中的注释,以解决在容器中交换组件插入顺序的问题。
最佳答案
通过拥有静态的IoC类,您实际上是在将容器用作服务定位器,从而失去了依赖注入的大部分好处。
问题在于,如果没有适当的注入,Windsor不会知道CriticalService-IEmailService依赖项,因此无法确保正确的处置顺序。
如果重构以明确显示此依赖关系,则Windsor会以正确的顺序处理组件:
internal class CriticalService : ICriticalService, IStartable
{
private readonly IEmailService email;
public CriticalService(IEmailService email) {
this.email = email;
}
...
}
Here's how it would look像重构后一样。
关于c# - 城堡零件处置命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2180779/