gpt4 book ai didi

.net - 温莎城堡内部构造函数/类

转载 作者:行者123 更新时间:2023-12-03 04:28:00 24 4
gpt4 key购买 nike

我看了这个,它回答了我一半的问题:

Castle Windsor: Register class with internal constructor?

但是您可以使用 Windsor 来使用内部构造函数/类以及依赖项注入(inject)吗? (所以构造函数参数也被注入(inject))?我希望将类/构造函数保留在内部,以实现最佳封装(这些类不应公开给公众)。

我需要这个来支持 Silverlight,所以我认为这不是一个选择:

Castle Windsor: How to register internal implementations

谢谢。

最佳答案

这可能不是一个令人满意的答案,但最佳实践是使用公共(public)构造函数将您需要通过 CaSTLe 实例化的所有类设为公共(public)。您的设计应该允许下游依赖项实例化您的对象,而不依赖于 CaSTLe 或 InternalsVisibleTo。

对于你的问题,CaSTLe 只会搜索公共(public)构造函数来实例化对象。我不相信有办法让它搜索内部或私有(private)构造函数。但是,如果您的类是内部类,则可以将内部构造函数公开,而无需更改封装。请参阅以下测试用例:

[TestFixture]
public class InternalConstructorTests
{
[Test]
public void Test()
{
using (var container = new WindsorContainer())
{
container.Register(
Component.For<IFoo>().ImplementedBy<Foo>(),
Component.For<IBar>().ImplementedBy<Bar>(),
Component.For<IBaz>().ImplementedBy<Baz>()
);
// fails because Castle can't find, and won't call, the internal constructor
Assert.Throws<ComponentActivatorException>(()=>container.Resolve<IFoo>());
// passes because the Baz constructor is public, but the "real" encapsulation
// level is the same because the class is internal, effectively making the
// public constructor internal as well
container.Resolve<IBaz>();
}
}
}
internal interface IBar{}
internal class Bar : IBar{}
internal interface IFoo{}
internal class Foo : IFoo
{
internal Foo(IBar bar)
{
}
}
internal interface IBaz { }
internal class Baz : IBaz
{
public Baz(IBar bar)
{
}
}

关于.net - 温莎城堡内部构造函数/类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com