1

当社には標準的なアプリケーションがあります。次に、アプリケーションにいくつかのカスタムアセンブリを挿入します。

通常、ninjectカーネルまたはUnityコンテナーがある場合は、次のような実装を取得できます。

IKernel kernel = new StandardKernel();
DealerService myServ = new DealerService(kernel.Get<IDealerController>());

DealerService:

public partial class DealerService : ServiceBase
{
    private readonly IDealerController Controller;

    public DealerService(IDealerController controller)
    {
        Controller = controller;

        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Process();
    }

    protected override void OnStop()
    {
    }

    public void Process()
    {
        Controller.GetDealerDetails(5);
    }
}

DealerControllerインターフェース

public interface IDealerController
{
    Dealer GetDealerDetails(int dealerId);
}

ディーラーコントローラーの実装:

public class DealerController : IDealerController
{
    public Dealer GetDealerDetails(int dealerId)
    {     
        throw new NotImplementedException("This is a custom error thrown from the controller implementation");
    }
}

ここで重要なのは、標準アプリケーションがカスタムアセンブリについて認識したくないということです。ディーラーサービスはワークフローアクティビティであるため、ワークフローファウンデーションによって動的に検出されます。問題は、注入されたものが空であるということです...標準アプリケーションに行なしでDealerControllerの実装を注入するにはどうすればよいですか。IDealerControllerkernel.Get<IDealerController>()

ninject MVC 3 nugetパッケージでNinjectを使用する場合、実装は、を呼び出さずにmvcコントローラーのコンストラクターに挿入されkernel.Get<IDealerController>()ます。

編集: アセンブリ名Ninject.Extensions.Controllers.Moduleとしてモジュールを追加し、命名規則によってモジュールが検出されるようにしました。これについては、Ninjectのドキュメントで説明されています。これは私のMVCアプリケーションで機能します。

public class ControllersModule : NinjectModule
{
    public override void Load()
    {            
        this.Bind<IDealerController>().To<DealerController>();            
    }
}
4

2 に答える 2

1

IDealerController実装をに注入する場合DealerServiceは、Ninjectにのインスタンス化を管理させる必要もありますDealerService

IKernel kernel = new StandardKernel();
kernel.Bind<IDealerController>.To<DefaultDealerController>(); //.InSingletonScope();
kernel.Bind<DealerService>().ToSelf(); //.InSingletonScope();
DealerService myServ = kernel.Get<DealerService>();

Ninject構成を動的にロードするには、モジュールのアプローチとkernel.Load("*.dll")メソッドを使用できます。いくつかのインターフェースの複数の実装がある場合は、条件付きバインディングを使用して、どれを使用するかを指定する必要もあります。

kernel.Bind<IDealerController>
      .To<SpecialDealerController>()
      .When(x=> SpecialConditionIsMet());
于 2013-03-18T22:39:30.157 に答える
0

アセンブリごとに異なるModule継承を行うことができます。NinjectModule

public class WarriorModule : NinjectModule
{
    public override void Load() 
    {
        Bind<IWeapon>().To<Sword>();
        Bind<Samurai>().ToSelf().InSingletonScope();
    }
}

次に、を使用して、次のKernelすべてのアセンブリからすべてのモジュールを動的にロードしますAppDomain

kernel.Load(AppDomain.CurrentDomain.GetAssemblies());

すべての例は、Ninjectのドキュメントから抜粋したものです。

于 2013-03-18T22:22:27.627 に答える