2011-11-28 27 views
6

Tôi chưa bao giờ sử dụng Windsor trước đây nhưng đã sử dụng các khung công tác DI khác và hiện tại tôi có một vấn đề khá lạ.Castle Windsor 3 với đối số hàm tạo là chuỗi

Tôi có một lớp nhà máy mà phải mất một chuỗi trong constructor của nó, tuy nhiên bất cứ khi nào tôi cố gắng và giải quyết các đối tượng mà tôi nhận được một ngoại lệ nói:

Handler for System.String was not found. 

<Message>Handler for System.String was not found.</Message> 
<StackTrace>at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.TryGetHandlerFromKernel(DependencyModel dependency, CreationContext context) in d:\60b7fa65294e7792\src\Castle.Windsor\MicroKernel\Resolvers\DefaultDependencyResolver.cs:line 403 
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveCore(CreationContext context, ComponentModel model, DependencyModel dependency) in d:\60b7fa65294e7792\src\Castle.Windsor\MicroKernel\Resolvers\DefaultDependencyResolver.cs:line 270</StackTrace> 
<Type>Castle.MicroKernel.Handlers.HandlerException</Type> 
</InnerException> 
<Message>Missing dependency. 
Component SomeExampleFactory has a dependency on System.String, which could not be resolved. 
Make sure the dependency is correctly registered in the container as a service, or provided as inline argument.</Message> 

Lớp trông giống như sau:

public interface IDummyFactory 
{ 
    void DoSomething(); 
} 

public class DummyFactory : IDummyFactory 
{ 
    private string someString; 

    public DummyFactory(string someConstructorArg) 
    { 
     someString = someConstructorArg; 
    } 
} 

Với thiết lập DI bên dưới:

var someString = "some constructor arg"; 
_container.Register(Component.For<IDummyFactory>().ImplementedBy<DummyFactory>().DependsOn(someString)); 

Tôi giả định rằng nó đang cố gắng thực hiện một số loại đúc hoặc định dạng gây ra nó để bom ra, nhưng như loại chính nó là một chuỗi, và biến được chuyển trong một chuỗi ... nó thậm chí có thể là một trường hợp mà nó đang cố gắng để ánh xạ các loại biến đó chứ không phải là nội dung thay đổi, nhưng tôi không biết đủ về khuôn khổ DI và các tài liệu xung quanh khu vực này

+0

Phiên bản Castle Windsor nào? –

Trả lời

8

Thử gọi sự quá tải của DependsOn mà phải mất một IDictionary của cặp khóa/giá trị gia tăng để xác định phụ thuộc:

_container.Register(
    Component.For<IDummyFactory>() 
     .ImplementedBy<DummyFactory>() 
     .DependsOn(new Hashtable 
     { 
      { "someConstructorArg", "some constructor arg" } 
     })); 
10

Tôi cũng đang tìm kiếm câu trả lời cho điều này và có vẻ như bây giờ họ có cái gì đó đơn giản hơn một chút mà họ gọi là "Phụ thuộc nội tuyến" được thực hiện bởi (trong số các cách khác) phương thức ependency.OnValue().

Dưới đây là ví dụ chung chung từ các tài liệu:

var twitterApiKey = @"the key goes here"; 

container.Register(
    Component.For<ITwitterCaller>().ImplementedBy<MyTwitterCaller>() 
     .DependsOn(Dependency.OnValue("APIKey", twitterApiKey)) 
    ); 

Nó sẽ sử dụng giá trị trong twitterApiKey cho paramter có tên "APIKey" (không phải trường hợp nhạy cảm).

http://docs.castleproject.org/Windsor.Inline-Dependencies.ashx

Nó trông như thế này có thể đã đi vào như các phiên bản 3.1, nhưng tôi không thể khá giải mã ước update gắn thẻ của họ.

Các vấn đề liên quan