6

StructureMap kullanarak MVC projem için setter/property injection ayarlamaya çalışıyorum, ancak özellikleri ayarlamak için bunu elde edemiyorum. Constructor enjeksiyonunun önerilen uygulama olduğunun farkındayım, ancak setter enjeksiyonunu kullanarak bunu yapmamızı gerektiren sıkı bir şartım var, bu yüzden lütfen bana başka türlü söylemeye çalışan yorumları saklayınız. StructureMap Setter Enjeksiyon ayarlanmadı özellik

Böyle benim Global.asax aşağıdaki gibi normal Demirbaş kurulum koduna sahip

Benim TestControllerFactory benziyor
ControllerBuilder.Current.SetControllerFactory(new TestControllerFactory()); 

ObjectFactory.Initialize(x => { 
      x.For<IPaymentService>().Use<PaymentService>(); 
      x.ForConcreteType<HomeController>().Configure.Setter<IPaymentService>(y => y.PaymentService).IsTheDefault(); 
      x.SetAllProperties(y => 
      { 
       y.OfType<IPaymentService>(); 
      }); 

     }); 

aşağıdadır:

public class TestControllerFactory:System.Web.Mvc.DefaultControllerFactory 
{ 
    protected IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      throw new ArgumentNullException("controllerType"); 
     return ObjectFactory.GetInstance(controllerType) as IController ; 
    } 
} 

aşağıdaki Servisi/Uygulama sınıfı çift var

public interface IPaymentService 
{ 

} 

public class PaymentService:IPaymentService 
{ 

} 

Ve son olarak, wil benim denetleyiciniz {; Seti;}

public ActionResult Index(){ 
     var test = Service... //Service is Null 
} 

kamu IPaymentService Servisi {get}

Kontrolör :

public class HomeController: l içine enjekte beton ödeme hizmeti uygulaması olması gerekir özelliği vardır Yukarıda gösterilen, hata ayıkladığımda özellik boş kalır. Ayrıca, [SetterProperty] ürününü yalnızca çalışıp çalışmadığını (denetleyicilerimi bu özniteliklerle eşleştirmek gibi bir niyetim olmadığını) kullanmayı denedim ve hala çalışmadı.

Başka bir şey yapmam gerekmediğinden veya sorunun ne olabileceğinden emin değilim. Ben oldukça uzun bir süre StructureMap ile constructor enjeksiyon kullanıyorum. Bu çizgi bırakarak

+0

Eğer Setter Enjeksiyonu ile herhangi bir şans var mı? Eylem Filtreleri üzerinde çalışıyorum ama aynı zamanda işe yaramıyor. – ntombela

+0

Setter enjeksiyonu ile çalıştıktan sonra, ondan uzaklaşmaya karar verdim. – Joel

cevap

3

Dene:

x.ForConcreteType<HomeController>().Configure 
    .Setter<IPaymentService>(y => y.PaymentService).IsTheDefault(); 

Bu gerekli olmamalıdır.

aşağıdaki denetleyicisi Verilen:

public class HomeController : Controller 
{ 
    public IMsgService Service { get; set; } 

    public ActionResult Index() 
    { 
     return Content(Service.GetMessage()); 
    } 
} 

Bu oldu özelliğini ayarlamak için StructureMap yapılandırmak için gerekli olduğu tüm:

ObjectFactory.Initialize(cfg => 
{ 
    cfg.For<IMsgService>().Use<MyMsgService>(); 

    cfg.SetAllProperties(prop => 
    { 
     prop.OfType<IMsgService>(); 
    }); 
}); 

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
+0

Bu çözüm, özellik bir "denetleyici" sınıfındaysa çalışır, benim durumumda, "denetleyici olmayan" sınıfıdır, böylece cevabınız bana yardımcı olmaz. –

+0

Herhangi bir fark yaratmamalıdır * sağlama * StructureMap'i nesne grafiğindeki tüm bağımlılıklar ile yapılandırdınız. –

+0

"IUnitOfWork" özelliğini kendi denetleyicime koyarım ve değeri alır ancak başka bir sınıfa koyduğumda "MyServiceFactory" ve denetleyicideki "MyServiceFactory" sınıfını başlattığınızda "IUnitOfWork" özelliği "null" olur. –