当社には標準的なアプリケーションがあります。次に、アプリケーションにいくつかのカスタムアセンブリを挿入します。
通常、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
の実装を注入するにはどうすればよいですか。IDealerController
kernel.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>();
}
}