C# Ninject-类库项目中静态类中的内核

C# Ninject-类库项目中静态类中的内核,c#,dependency-injection,inversion-of-control,ninject,C#,Dependency Injection,Inversion Of Control,Ninject,我有和你一样的问题 但我没有使用WCF,只是一个类库 最好是有一个静态内核还是随时实例化它? 我的UI(现在在MVC应用程序中)使用服务,所以它会调用静态内核吗? 最好的方法是什么 使用IoC时,首选方法是尽可能少地使用内核。它应该在初始化时用于连接所有内容,然后快速、安静地消失在背景中。因此,“好莱坞原则”适用的地方是:“不要给IoC容器打电话,让它给你打电话!”。包含内核的静态类称为服务定位器反模式,请参阅 简而言之:您希望使用构造函数注入来注入依赖项,而不是每次都创建内核或引用静态类。有,

我有和你一样的问题 但我没有使用WCF,只是一个类库

最好是有一个静态内核还是随时实例化它? 我的UI(现在在MVC应用程序中)使用服务,所以它会调用静态内核吗?
最好的方法是什么

使用IoC时,首选方法是尽可能少地使用内核。它应该在初始化时用于连接所有内容,然后快速、安静地消失在背景中。因此,“好莱坞原则”适用的地方是:“不要给IoC容器打电话,让它给你打电话!”。包含内核的静态类称为服务定位器反模式,请参阅


简而言之:您希望使用构造函数注入来注入依赖项,而不是每次都创建内核或引用静态类。

有,为什么不在MVC UI中使用它呢

WCF服务可以有自己的。当然,您可以在这两个模块中重用一个
NinjectModule
实现。因此,
Kernel
不需要是静态的,只需在每个组合根中重用
NinjectModule
实现即可

例如,您可以选择以下应用程序配置:

public class ApplicationModule : NinjectModule
{
    public override void Load()
    {
        Bind<IAbstraction>().To<Implemtation>();
        //  and other general bindings
    }
}
公共类应用程序模块:NinjectModule
{
公共覆盖无效负载()
{
绑定()到();
//和其他通用绑定
}
}
:

公共类YourWebApplication:NinjectHttpApplication
{
公共覆盖IKernel CreateKernel()
{
var kernel=新的标准内核(新的ApplicationModule());
//添加一些特定于UI的绑定,例如授权
kernel.Bind()到:

public类全局:ninjectwcfaapplication
{
受保护的覆盖IKernel CreateKernel()
{
var kernel=新的标准内核(新的ApplicationModule());
//添加一些特定于服务的绑定,例如授权
//该服务还有一些我称之为提供商的其他小型服务
//因此,ex服务1:has Iprovider1 Iprovider2 Iprovider3
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
返回内核;
}
}

马克·希曼在他的博客中如是说 只有应用程序应该有合成根,库和框架不应该

这就是我的问题的答案,我更了解复合根模式。
感谢Akim和Alexander R的帮助

您希望使用构造函数注入来注入依赖项,而不是每次都创建内核或引用静态类。您能解释一下吗?如果内核本身没有实例化,内核将如何接受构造函数?在初始化时,您使用内核来更新任何有依赖关系的服务,可能还有一些内核支持的工厂来生成特定类型的实例,之后您只需要访问服务或工厂,似乎没有涉及IoC容器。抱歉,我真的不明白。是的,我在UI中使用ninject和mvc来选择适当的服务实现。t事实上,在我的服务中,我还有一些其他的小型服务,我称之为提供者,所以在服务1之前:Iprovider1 Iprovider2 Iprovider3…所以我希望在服务中注入正确的提供者(静态,来自DB,用于测试)希望你能理解我。这里有两个问题:1.MVC和
Service1
是否在同一个
AppDomain
?2.它们来自同一个源代码树?如果至少第一个是“是”,一个
内核可以注入所有内容。如果第一个是“否”,但它们来自同一个源代码树(第二个是“是”)配置可以重用。无论如何,创建一个静态的
内核
会引入额外的依赖关系,但不会解决它。没有MVC和服务不在同一个库中,MVC与Contracts库(定义服务层的公共接口)对话"这就是为什么我希望mvc使用ninject选择正确的服务,但是在一个服务中,我可以注入正确的提供者。我想我会公开所有内容,并使用ninject为服务和提供者注入依赖关系。这是正确的做法吗?好的,这是更新的示例。它具有整个项目的通用配置
ApplicationModule
,并使用单独的绑定自定义UI和服务的合成根。您可以使用约定扩展此示例,而不是配置和自动发现。感谢akim,非常感谢您的帮助,我将尝试了解合成根,并向您提供反馈
public class YourWebApplication : NinjectHttpApplication
{
  public override IKernel CreateKernel()
  {
     var kernel = new StandardKernel(new ApplicationModule ());

     // add some UI specific bindings, for example authorization
     kernel.Bind<IAuthProvider>().To<AuthProvider>();

     // binding between service contract and implementation/client
     kernel.Bind<IServiceContract>().To<WcfServiceClient>();

     return kernel;
  }
}
public class Global : NinjectWcfApplication
{
    protected override IKernel CreateKernel()
    {
        var kernel = new StandardKernel(new ApplicationModule ());

        // add some service specific bindings, for example authorization
        // service has also some other small services that i call providers 
        // so ex Service 1 : has Iprovider1 Iprovider2 Iprovider3 
        kernel.Bind<IProvider1>().To<Provider1>();
        kernel.Bind<IProvider2>().To<Provider2>();
        kernel.Bind<IProvider3>().To<Provider3>();

        return kernel;
    }
}