2011-01-30 25 views
15

Tôi đang gặp sự cố khi tiêm một cá thể vào sơ đồ cơ sở cho các thử nghiệm của mình.StructureMap không thể sử dụng trường hợp tiêm cho tiêm setter

đối tượng đồ thị của tôi trông như thế này

internal class ConfigurationManager : IConfigurationManager : IManager 
{ 
    public ISomeManager SomeManager { get; set; } 
} 

internal class SomeManager : ISomeManager : IManager 
{ 
    public IConfigurationManager ConfigurationManager { get; set; } 
} 

1) đầu tiên tôi tạo container và thêm tất cả cơ quan đăng ký tìm thấy

_container = new Container(c => c.Scan(s => 
{ 
    s.TheCallingAssembly(); 
    s.LookForRegistries(); 
})); 

một trong những cụm quét có chứa các đăng ký sau

x.For<IConfigurationManager>().Singleton.Use<ConfigurationManager>(); 

2) sau đó tôi muốn tiêm một đối tượng giả đặc biệt dành cho các nhà quản lý này

_configurationManagerStub = MockRepository.GenerateStub<IConfigurationManager>(); 
_container.Inject(_configurationManagerStub); 

3) Sau đó, các trường hợp quản lý được tạo ra mà không cần tiêm setter cấu hình (để tránh phụ thuộc vòng tròn)

foreach (Type pluginType in AllManagers()) 
{ 
    managerInstances.Add(_container.GetInstance(pluginType)); 
} 

4) cuối cùng tôi sử dụng phương pháp BuildUp để đặt Thuộc tính loại IManager.

_container.Configure(x => x.SetAllProperties(c => 
{ 
    // configure the property injection for all managers 
    c.Matching(prop => typeof(IManager).IsAssignableFrom(prop.PropertyType)); 
})); 

// push in dependencies -> EXCEPTION 
managerInstances.ForEach(x => _container.BuildUp(x)); 

Thật không may trong dòng mã cuối cùng tôi nhận được ngoại lệ sau.

StructureMap.StructureMapException: StructureMap Exception Code: 245 Lỗi trong khi cố gắng để tạo ra một InstanceBuilder cho IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = trung tính, PublicKeyToken = null ----> Hệ thống .ArgumentException: Biểu hiện của gõ 'System.Object' không thể được sử dụng cho các tham số có kiểu 'System.String' của phương pháp 'Castle.Core.Interceptor.IInterceptor [] GetIInterceptor []'

Tại sao structuremap cố gắng sử dụng một InstanceBuilder khi tôi đã tiêm cá thể?

Br, David

+0

Bạn đã giải quyết được sự cố này chưa? Tôi có cùng ngoại lệ. – AdamSane

Trả lời

1

Vấn đề là với sự hỗ trợ StructureMap Castle DynamicProxy (Rhino Mocks và Moq sử dụng nó) được tạo ra cuống khi được sử dụng trong tích tụ.

Cụ thể Lâu đài tạo ra một hàm tạo với 2 tham số cho loại proxy được yêu cầu và các tham số đó không có tên. ConstructorFunctionBuilder trong StructureMap không tạo ra biểu thức lambda đúng trong trường hợp này (null được coi là System.Object nơi System.String được mong đợi). Thats thậm chí không cần thiết khi bạn chỉ muốn thiết lập setters thuộc tính, nhưng không có cách nào để kiểm soát điều này.

"Tiêm" sẽ hoạt động với các cuống không được tạo động, nhưng bạn có thể muốn tìm một giải pháp khác.

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