6

Tôi nhìn này và nó trả lời nửa câu hỏi của tôi:Lâu đài Windsor nội Constructor/Lớp

Castle Windsor: Register class with internal constructor?

Nhưng bạn có thể sử dụng Windsor để sử dụng nhà thầu nội bộ/lớp cùng với dependency injection? (do đó, các tham số constructor cũng được tiêm)? Tôi muốn giữ cho lớp/constructor bên trong để cho phép đóng gói tối ưu (các lớp này không nên tiếp xúc với công chúng).

tôi cần điều này để hỗ trợ Silverlight, vì vậy tôi không nghĩ rằng đây là một lựa chọn:

Castle Windsor: How to register internal implementations

Cảm ơn.

+0

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. –

+1

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

+0

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. –

Trả lời

6

Đâ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) 
    { 
    } 
} 
Các vấn đề liên quan