1

我们公司有一个标准应用程序。现在我想在应用程序中注入一些自定义程序集。

通常,如果您有一个 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>();            
    }
}
4

2 回答 2

1

如果您想将实现IDealerController注入.DealerServiceDealerService

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 回答