Đây có thể không phải là câu trả lời thỏa mãn, nhưng cách tốt nhất là tạo tất cả các lớp mà bạn cần để khởi tạo qua công khai Lâu đài, với các nhà thầu công khai. Thiết kế của bạn nên cho phép một phụ thuộc hạ lưu để khởi tạo các đối tượng của bạn mà không dựa vào Castle hoặc InternalsVisibleTo.
Đối với câu hỏi của bạn, Castle sẽ chỉ tìm kiếm các nhà thầu công khai để khởi tạo một đối tượng. Tôi không tin rằng có một cách để làm cho nó tìm kiếm các nhà xây dựng nội bộ hoặc tư nhân. Tuy nhiên, nếu lớp của bạn là nội bộ, bạn có thể làm cho các nhà xây dựng nội bộ của bạn công khai mà không thay đổi sự đóng gói nào cả. Xem trường hợp kiểm tra sau:
[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)
{
}
}
Nguồn
2010-10-25 18:57:25
IMHO đây không phải là đóng gói tối ưu. Nếu bạn cần Windsor để truy cập vào các lớp này thì chúng không được đóng gói đúng cách. Hoặc viết mặt tiền hoặc đặt chúng ở chế độ công khai. –
Tôi không chắc mình hiểu. Tôi có một dịch vụ IMyService giao diện công cộng. Tôi không muốn việc triển khai hiển thị với người tiêu dùng dịch vụ. Vì vậy, tôi có lớp nội bộ thực hiện MyService: IMyService. Kịch bản này không đại diện cho việc đóng gói tối ưu như thế nào? – Jeff
bạn đang nhầm lẫn giữa các loại nội bộ với giao diện. Đây là những vấn đề trực giao. –