6

Tôi đang cố gắng thiết lập setter/thuộc tính tiêm cho dự án MVC của tôi bằng cách sử dụng StructureMap, nhưng tôi dường như không thể làm cho nó thiết lập các thuộc tính. Tôi nhận thức rõ rằng việc tiêm Constructor là thực hành được khuyến nghị, nhưng tôi có một yêu cầu nghiêm ngặt yêu cầu chúng tôi thực hiện nó bằng cách sử dụng tiêm setter, vì vậy hãy giữ các bình luận cố gắng nói với tôi bằng cách khác.StructureMap Setter Injection không thiết lập thuộc tính

Tôi có đoạn code cài đặt soạn bình thường như sau trong Global.asax của tôi

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>(); 
      }); 

     }); 

TestControllerFactory của tôi trông giống như sau:

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 ; 
    } 
} 

tôi có Dịch vụ/Thực hiện cặp lớp sau

public interface IPaymentService 
{ 

} 

public class PaymentService:IPaymentService 
{ 

} 

Và cuối cùng, tôi có bộ điều khiển của mình l có tài sản mà cần phải có việc thực hiện dịch vụ thanh toán cụ thể tiêm vào nó:

public class HomeController: Bộ điều khiển { công cộng Dịch vụ IPaymentService {get; set;}

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

}

Hiển thị ở trên, thuộc tính vẫn giữ nguyên khi tôi gỡ lỗi.

Ngoài ra, tôi đã thử sử dụng [SetterProperty] chỉ để xem nếu nó hoạt động (tôi không có ý định kết nối bộ điều khiển của tôi với các thuộc tính), và nó vẫn không hoạt động.

Tôi không chắc mình có cần làm gì khác không, hoặc vấn đề có thể là gì. Tôi đã được sử dụng tiêm constructor với StructureMap cho một thời gian.

+0

Bạn có bất kỳ may mắn với setter injection? Tôi đang thử trên bộ lọc hành động nhưng nó dường như không hoạt động. – ntombela

+0

Sau khi đấu tranh để làm việc với tiêm setter, tôi quyết định di chuyển ra khỏi nó. – Joel

Trả lời

3

Hãy thử bỏ dòng này:

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

Nó không cần thiết.

Với bộ điều khiển sau:

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

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

Đây là tất cả những gì được yêu cầu phải cấu hình StructureMap để thiết lập thuộc tính:

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

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

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

Giải pháp này chỉ hoạt động nếu thuộc tính nằm trong lớp 'controller', trong trường hợp của tôi thuộc tính là lớp' non-controller' để câu trả lời của bạn không giúp được gì. –

+0

Nó sẽ không tạo ra bất kỳ sự khác biệt nào * cung cấp * bạn đã cấu hình StructureMap với tất cả các phụ thuộc trong đồ thị đối tượng. –

+0

Tôi đặt thuộc tính của tôi 'IUnitOfWork' trong bộ điều khiển của mình và nó nhận giá trị nhưng khi tôi đặt nó trong lớp khác' MyServiceFactory' và khởi tạo lớp 'MyServiceFactory' trong bộ điều khiển của tôi thuộc tính' IUnitOfWork' là 'null'. –

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