2011-01-30 8 views
15

Testlerimin bir örneğini structuremap içine enjekte etmemde bir sorun yaşıyorum.YapıYükleme enjeksiyonu için enjekte edilmemiş örneği kullanmak mümkün değil

My nesneleri grafiği, bu

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

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

1) i ilk bulunan tüm kayıtları kabı oluşturmak ve ekleme bu taranmış düzeneklerinin

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

bir Aşağıdaki kayıt içeren benzer

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

2) sonra (

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

) dairesel bağımlılıkları önlemek için bu yöneticileri

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

3) Daha sonra yönetici örnekleri yapılandırılmış ayarlayıcı enjeksiyonu olmadan oluşturulur için özel bir sahte nesne enjekte istiyorum 4) Sonunda IManager türünün Özelliklerini ayarlamak için BuildUp yöntemini kullanıyorum.

_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)); 

Son kod satırındaki talihsizde, aşağıdaki özel durumu elde ediyorum.

StructureMap.StructureMapException: StructureMap İstisna Kodu: IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2 için bir InstanceBuilder oluşturmaya çalışırken 245 Hata, Sürüm = 0.0.0.0, Culture = neutral, PublicKeyToken = null ----> Sistem .ArgumentException: türü 'System.Object' ifadesi yöntemi arasında 'System.string' parametresi için kullanılamaz 'Castle.Core.Interceptor.IInterceptor [] GetIInterceptor []'

Neden structuremap örneği enjekte ettiğimde bir InstanceBuilder kullanmayı deniyor?

Br, David

+0

Bu sorunu çözdünüz mü? Bende aynı istisna var. – AdamSane

cevap

1

sorun Şato DynamicProxy arasında StructureMap desteği ile (Rhino Mocks ve MOQ kullandığı) birikmesi kullanıldığında koçanları oluşturulur.

Özellikle Kale, istenen proxy türü için 2 parametreli bir kurucu oluşturur ve bu parametrelerin adları yoktur. StructureMap içerisindeki ConstructorFunctionBuilder, bu durumda uygun lambda ifadesi oluşturmada başarısız olur (null, System.String'in beklendiği System.Object olarak kabul edilir). Bu, mülk belirleyicileri kurmak istediğinizde bile gerekli değildir, ancak bunu kontrol etmenin bir yolu yoktur.

"Enjekte Et", dinamik olarak oluşturulmamış dizelerle çalışır, ancak farklı bir çözüm aramak isteyebilirsiniz.

İlgili konular