2

我使用本教程在我的解决方案中创建插件架构,并且我也是第一次使用 ninject:

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=358360&av=526320&msg=4308834#xx4308834xx

现在在 MVC 应用程序中,当用户正在结帐时,我得到了他选择的付款方式,并且需要检索所选付款方式的插件。我已经成功地以这种方式检索插件控制器,但我不知道这是否安全或可接受的做法:

Type type = Type.GetType(paymentMethod.PaymentMethodPluginType);  

 //get plugin controller

var paymentController = ServiceLocator.Current.GetInstance(type) as BasePaymentController;

//get validations from plugin

    var warnings = paymentController.ValidatePaymentForm(form);

        //get payment info from plugin

        var paymentInfo = paymentController.GetPaymentInfo(form);
        //…

我还需要访问一个插件类来处理付款。我有一个接口 IPaymentMethod

  public partial interface IPaymentMethod 
  {
   void  PostProcessPayment (PostProcessPaymentRequest postprocessPaymentRequest);        

  }

和插件 PaymentProcessor 像这样

public class PluginPaymentProcessor :IPaymentMethod
    {        
        public void PostProcessPayment (PostProcessPaymentRequest postprocessPaymentRequest)
        {
            ///
        }

Now in MVC project I try to access PostProcessPayment method this way 

IPaymentMethod pluginpaymentmethod = ServiceLocator.Current.GetInstance<IPaymentMethod>(paymentMethod.PaymentProcessor);

这里 paymentMethod.PaymentProcessor 是“MyApp.Plugins.MyPlugin.PluginPaymentProcessor, MyApp.Plugins.MyPlugin,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”</p>

   And want to use pluginpaymentmethod like i do in controller example

pluginpaymentmethod.PostProcessPayment(postProcessPaymentRequest);

但它会引发错误,即找不到资源并且未加载 pluginpaymentmethod。我该如何解决它,或者您可以建议任何具有类似实现的教程?谢谢你。

4

1 回答 1

2

假设您有一个名为MyPlugin的具有IPaymentMethod接口的具体类,那么您的 ninject 绑定应该看起来有点像:

private static void RegisterServices(IKernel kernel){
    kernel.Bind<IPaymentMethod>().To<MyPlugin>().InRequestScope();
}

检查这在文件夹NinjectWebCommon.cs下的班级中是否存在。App_Start一个更棘手的场景可能是必须以与绑定IPaymentMethodNinject 相同的方式注册:IKernel

kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);

这可能是一个更棘手的问题。

于 2012-07-26T15:50:16.250 回答