注射在标准应用自定义代码(Inject custom code in standard applic

2019-10-17 20:46发布

我们已经在我们公司的标准应用。 现在我想在注入应用一些自定义组件。

一般来说,如果你有一个ninject内核或统一的容器,你可以像下面的执行:

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");
    }
}

现在的事情是,我不希望这样的标准应用程序知道的自定义组件。 该dealerservice是一个工作流活动,以便通过工作流程的基础动态发现的。 问题是,注入的DealerController是空的......我怎么能注入的实施IDealerController我standardapplication没有行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>();            
    }
}

Answer 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());


Answer 2:

您可以有不同的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文档 。



文章来源: Inject custom code in standard application