2

私は自分のプロジェクトを作成しましたが、キャッスルを使用してインターフェースの実装をスピンアップできません! ControllersInstaller以下にWindsorControllerFactory示すクラスを追加しました。私のコントローラーは、以下のコードの最後のスニペットです。助けてください!ありがとう、ジェームズ

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IKernel kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public override void ReleaseController(IController controller)
    {
        kernel.ReleaseComponent(controller);
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
        }
        return (IController)kernel.Resolve(controllerType);
    }
}



public class ControllersInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
                        .BasedOn<IController>()
                        .LifestyleTransient());
    }
}






 public class HomeController : Controller
{
    public IMemberMapper _memberMapper;

    public HomeController()
    {
    }

    public HomeController(IMemberMapper memberMapper)
    {
        _memberMapper = memberMapper;
    }

    public ActionResult Index()
    {
        var model = _memberMapper.Map();
        return View(model);
    }
}

// グローバルファイル

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
    }

    private static IWindsorContainer container;

    private static void BootstrapContainer()
    {
        container = new WindsorContainer()
            .Install(FromAssembly.This());
        var controllerFactory = new WindsorControllerFactory(container.Kernel);
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);
    }

    protected void Application_End()
    {
        container.Dispose();
    }
}
4

2 に答える 2

0

WindsorControllerFactory現在として登録しましたControllerFactoryか?

これは通常、Globals.asax.csで行われます。実行しなかった場合は、次の例を参照してください:https ://github.com/kkozmic/ToBeSeen/blob/master/src/ToBeSeen/Global.asax.cs

より具体的には、BootstrapContainer()メソッドとそれが呼び出される場所を確認します。これにより、ASP.NET MVCは、新しく定義されたファクトリを使用して必要になる可能性のあるコントローラーの作成を試みるように指示されます。この手順がなければ、組み込みのコントローラーファクトリを使用しているだけです。

于 2012-12-26T18:36:42.563 に答える
0

IMemberMapperサービスをどこかに登録する必要があります。この目的に最適な場所は、別のインストーラー クラスです。

于 2012-12-27T11:07:05.920 に答える