2013-03-18 84 views
1

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

一般来说,如果你有一个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"); 
    } 
} 

现在的事情是我不希望标准应用程序知道自定义程序集。经销商服务是一个工作流活动,因此可以通过工作流基础动态找到。问题是注入的DealerController是空的... 如何在我的标准应用程序中注入IDealerController的实现,而不需要行kernel.Get<IDealerController>()

如果您将Ninject与ninject MVC 3 nuget包一起使用,则将实现注入到mvc控制器的构造函数中,而不用调用kernel.Get<IDealerController>()

编辑: 加入所以该模块是通过命名约定发现作为集名称Ninject.Extensions.Controllers.Module该模块。这在Ninject documentation中描述。这在我的MVC应用程序中起作用。

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

您是否知道'Modules'和'Kernel.Load'机制(并且可以使用该上下文中的teminology来澄清您的问题)? – 2013-03-18 21:03:11

+0

我在上面添加了我的模块。 – 2013-03-19 08:02:33

回答

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配置可以使用modules方法和kernel.Load("*.dll")方法。如果您将有多个接口的实现,您还应该指定在conditional binding的帮助下应该使用哪一个接口。

kernel.Bind<IDealerController> 
     .To<SpecialDealerController>() 
     .When(x=> SpecialConditionIsMet()); 
+0

如果忘记使用Ninject实例化DealerService本身。第3行和第4行代码为我做了诀窍。 现在我有以下问题。如果DealerService是Workflow Foundation的活动,该怎么办?因此标准应用程序正在启动用户设计的工作流程。在该工作流程中,他使用我的自定义wf活动(DealerService),并且DealerService必须实例化DealerController。我应该通过Ninject创建工作流调用器的实例来使其工作吗? – 2013-03-19 08:21:34

+0

看到这个我的新问题:http://stackoverflow.com/questions/15498403/dependency-injection-in-custom-workflow-activity – 2013-03-19 11:37:36

+0

我不熟悉WF。尝试阅读Ninject wf扩展wiki并在那里获得答案。 – mipe34 2013-03-20 20:27:52

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 documentation

相关问题