2

Ninject2とASP.NETMVC2を使い始めようとしています。このチュートリアルhttp://www.craftyfella.com/2010/02/creating-aspnet-mvc-2-controller.htmlに従って、作成しました。 Ninjectを使用し、最初の抽象を具体的な実装にバインドするコントローラーファクトリ。ここで、別のアセンブリ(具体的なSQLリポジトリが配置されている場所)からリポジトリタイプをロードしたいのですが、それを機能させることができません。これが私のコードです:

Global.asax.cs

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);


        ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
    }

コントローラーファクトリー:

public class Kernelhelper
{
    public static IKernel GetTheKernel()
    {
        IKernel kernel = new StandardKernel();
        kernel.Load(System.Reflection.Assembly.Load("MyAssembly"));
        return kernel;
    }
}

public class MyControllerFactory : DefaultControllerFactory
{
    private IKernel kernel = Kernelhelper.GetTheKernel();


    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {

        return controllerType == null ? null : (IController)kernel.Get(controllerType);
    }
}

「MyAssembly」にはモジュールがあります:

    public class ExampleConfigModule : NinjectModule
{
    public override void Load()
    {
        Bind<Domain.CommunityUserRepository>().To<SQLCommunityUserRepository>();
    }

}

これで、エントリポイントのMockRepositoryオブジェクトをたたくと、正常に動作し、リポジトリを必要とするコントローラが正常に動作します。kernel.Load(System.Reflection.Assembly.Load( "MyAssembly")); また、その仕事をしてモジュールを登録しますが、リポジトリを必要とするコントローラーを呼び出すとすぐに、NinjectからActivationExceptionが発生します。

一致するバインディングは使用できず、タイプは自己バインドできません。アクティベーションパス:2)タイプAccountControllerのコンストラクターのパラメーター_repへの依存性CommunityUserRepositoryの注入1)AccountControllerの要求

誰かが私に外部アセンブリからのバインディングタイプのベストプラクティスの例を教えてもらえますか(これは本当に依存性注入の重要な側面です)?ありがとうございました!

4

1 に答える 1

0

さて、私はいくつかのリファクタリングを行い、今それを実行しました。Global.asaxのコードを投稿します。ここで、すべてが発生します。最新のNinject2ビルドとMVC2用の最新のNinject.Web.Mvcビルドを使用しています。

 public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        RegisterAllControllersIn(System.Reflection.Assembly.GetExecutingAssembly());
    }


    protected override Ninject.IKernel CreateKernel()
    {

        var kernel = new StandardKernel();
        kernel.Load(new ExampleConfigModule());
        return kernel;
    }
}

public class ExampleConfigModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        string connectionString =
            ConfigurationManager.ConnectionStrings
            ["ConnectionString1"].ConnectionString;
        string communityUserRepTypeName =
           ConfigurationManager.AppSettings
           ["CommunityUserRepositoryType"];
        var communityUserRepositoryType =
            Type.GetType(communityUserRepTypeName, true);
        Bind<Domain.CommunityUserRepository>().To(communityUserRepositoryType).WithConstructorArgument("conString",connectionString);
    }

}

ご覧のとおり、NinjectHttpApplicationから継承されたControllerFactoryを削除し、モジュールで外部アセンブリのタイプをロードしてバインドしました。これで、構成ファイルでタイプを文字列として指定せずに、より良い方法があるかもしれません。外部アセンブリでモジュールを宣言し、そこからNinjectに自動ロードさせることもできますが、接続文字列をに渡す必要があります。具体的な実装のコンストラクター。多分誰かがこれについての考えを持っていました、しかし今のところこれはうまくいきます。

于 2010-04-10T09:17:13.630 に答える