2010-05-13 20 views
36

kullanırken yapıcı argümanlarını geçmek DI'm için StructureMap kullanıyorum. Ben belirtmek gerekirStructureMap

public class ProductProvider : IProductProvider 
{ 
    public ProductProvider(string connectionString) 
    { 
     .... 
    } 
} 

Ben IProductProvider bir örneğini olsun "çalışma zamanında de connectionString şöyle ben StructureMap yapılandırmış

: Ben gibi 1 argüman alır sınıf var düşünün.:

ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>(). 
WithCtorArgument("connectionString"); 

Ancak, ben EqualTo aramak istemiyorum ("bir şey ...") yöntemini burada dinamik çalışma anında bu değeri belirtmek için bazı tesis gerekir gibi.

Sorum: ObjectFactory kullanarak bir IProductProvider örneğini nasıl alabilirim?

Şu anda, böyle bir şey var:

ObjectFactory.GetInstance<IProductProvider>(); 

Ama bildiğiniz gibi, bu Herhangi bir tavsiye büyük takdir

... çalışmıyor.

cevap

32

Cevabı kendim buldum! İşte çözüm şu: aynı sorunla karşılaşan başkalarına yardım etmesini umuyorum.

+1

someValueAtRuntime öğesinin basit bir değer olduğundan emin olun, herhangi bir Func veya Lambda türü (eğer bunu yapabilirseniz) için değil, aksi takdirde bağımlılık çözümlendiğinde bu işlev çalışır. Bu numarayı, yaptığınız gibi bir bağlantı dizesi enjekte etmek için kullandım. ObjectFactory'yi kurmadan önce dizeyi yerel bir değişkene aldığınız sürece, iyi olmalısınız. – Mel

+5

Yo. Ya birden fazla argümanım varsa, arg1, 2, 3 vb. Ve her argümanı olduğu gibi geçmek istiyorum ama argümanlardan birini null olarak tutmak istiyorum. Bu nasıl yapılır? –

+0

@Mosh cevabınız için teşekkür ederiz, nasıl oluyor da bana bazı nasılValueAtRuneTime geçiyorsunuz? bunun bir örneği lütfen. – wandos

51

Bunu StructureMap yapılandırmasıyla bildirmeyi öneririm.

For<IProductProvider>().Use<ProductProvider> 
    .Ctor<string>("connectionString").Is(someValueAtRunTime); 

sen değerini bilmek zorunda yükü istemci kodu yok ve ana kodundan ayrı senin IoC yapılandırmasını tutabilir Bu şekilde: biraz daha yeni StructureMap kodunu kullanarak.

+1

Sanırım StructureMap'i yapılandırırken burası. 'SomeValueAtRunTime'yi buradan nasıl geçersiniz? – user1713059

İlgili konular