2011-08-18 24 views
6

Tôi có thể tưởng tượng điều này có thể là khá thẳng về phía trước để làm trong Castle nhưng tôi mới đến công nghệ và đã được Googling cho giờ không có may mắn!Tôi làm cách nào để khởi tạo thành phần như Singleton khi đăng ký?

tôi có như sau:

container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
    () => new MySpecialClass()).LifeStyle.Singleton); 

Bây giờ khá đúng đắn này đang được lười biếng-nạp, tức là biểu thức lambda thông qua vào UsingFactoryMethod() không được thực hiện cho đến khi tôi thậm chí đòi Castle để giải quyết cho tôi ví dụ của lớp.

Nhưng tôi muốn Castle tạo ví dụ ngay khi tôi đăng ký. Điều này có thể không?

Trả lời

8

Bạn chỉ có thể sử dụng xây dựng nó sở Startable như vậy:

container.AddFacility<StartableFacility>(); 
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start()); 

Bạn có thể đọc về nó here

7

Đối với trường hợp này đơn giản bạn có thể chỉ register an existing instance:

var special = new MySpecialClass(); 
container.Register(Component.For<MySpecialClass>().Instance(special)); 
+0

Cảm ơn bạn! Đây là những gì tôi đã kết thúc bằng cách sử dụng - container.Register (Component.For (). Instance (new MySpecialClass())); – jameskind

+1

Điều này không giống như cách tiếp cận tốt nhất kể từ khi bạn không rời khỏi instantiation đến container, và do đó phá vỡ các mô hình IoC. –

+0

@DavidPerlman Đúng vậy, khi tôi viết câu trả lời này, tôi nghĩ không có cách nào dễ dàng như câu trả lời gần đây của MosheLevi mô tả. –

1

Câu trả lời đang sử dụng "sơ thẩm" có thể không phải luôn luôn khả thi (nếu lớp có lớp phụ thuộc chính nó, nó sẽ không dễ dàng để mới nó lên). Trong trường hợp đó, ít nhất là trong Windsor 2.5, bạn có thể sử dụng này:

public static void ForceCreationOfSingletons(this IWindsorContainer container) 
    { 
     var singletons = 
      container.Kernel.GetAssignableHandlers(typeof (object)) 
        .Where(h => h.ComponentModel.LifestyleType == LifestyleType.Singleton); 

     foreach (var handler in singletons) 
     { 
      container.Resolve(handler.ComponentModel.Service); 
     } 
    } 

    // usage container.ForceCreationOfSingletons(); 
Các vấn đề liên quan