我们公司有一个标准应用程序。现在我想在应用程序中注入一些自定义程序集。
通常,如果您有一个 ninject 内核或统一容器,您可以获得如下实现:
IKernel kernel = new StandardKernel();
DealerService myServ = new DealerService(kernel.Get<IDealerController>());
经销商服务:
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);
}
}
经销商控制器接口
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 与 ninject MVC 3 nuget 包一起使用,则将实现注入到 mvc 控制器的构造函数中,而无需调用kernel.Get<IDealerController>()
.
编辑: 添加了作为程序集名称 Ninject.Extensions.Controllers.Module 的模块,以便通过命名约定找到模块。这在 Ninject文档中有所描述。这适用于我的 MVC 应用程序。
public class ControllersModule : NinjectModule
{
public override void Load()
{
this.Bind<IDealerController>().To<DealerController>();
}
}