6

StructureMap を使用して MVC プロジェクトのセッター/プロパティ インジェクションをセットアップしようとしていますが、プロパティを設定できないようです。コンストラクター インジェクションが推奨される方法であることは十分承知していますが、セッター インジェクションを使用する必要があるという厳格な要件があるため、そうでない場合はコメントを保留してください。

Global.asax に次のような通常のボイラープレート セットアップ コードがあります。

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 は次のようになります。

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

次のサービス/実装クラスのペアがあります

public interface IPaymentService
{

}

public class PaymentService:IPaymentService
{

}

そして最後に、具体的な支払いサービスの実装を注入する必要があるプロパティを持つコントローラーを用意しました。

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

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

}

上記のように、デバッグ時にプロパティは null のままです。

さらに、[SetterProperty] を使用して、それが機能するかどうかを確認しようとしましたが (コントローラーをこれらの属性と結合するつもりはありません)、それでも機能しませんでした。

他に何かする必要があるかどうか、または何が問題なのかわかりません。私はかなり長い間、StructureMap でコンストラクター インジェクションを使用してきました。

4

1 に答える 1

3

この行をドロップしてみてください:

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

必要ないはずです。

次のコントローラがあるとします。

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

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

StructureMap を構成してプロパティを設定するために必要な作業はこれだけでした。

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

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

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
于 2013-12-27T21:52:40.530 に答える