需要将 class 对象传递给 ninject
Need to pass class object to ninject
所以我正在研究 API 并将 Ninject 用于 DI 和 IoC。我知道使用 Ninject 的基本代码是如何工作的,但是在 类 之一的构造函数中,正在发送一个 Logger 对象。我不想在构造函数设计项中发送它,而是想在 NinjectWebCommon.cs
文件中传递它。
public GAMonthlyAPIController() : this(new GAMonthlySQLReader(new NullLogger()))
这是构造函数。
kernel.Bind<IGAMonthlyReader>().To<GAMonthlySQLReader>();
这是 NinjectWebCommon.cs
中的条目 我想将其绑定到 NinjectWebCommon.cs
而不是默认值。我将如何通过它?我什至不知道要搜索什么,所以我可以找到答案。
应用依赖注入模式最实用的方法是使用构造函数注入。这意味着 classes GaMonthlyAPIController
依赖应该通过构造函数传入,而不是在控制器内部硬编码。
public class GAMonthlyAPIController
{
private readonly IGAMonthlySQLReader gaMonthlySqlReader;
public GAMonthlyAPIController(IGAMonthlySQLReader gaMonthlySqlReader)
{
this.gaMonthlySqlReader = gaMontlySqlReader
?? throw new ArgumentNullException(nameof(gaMontlySqlReader));
}
// implementation of controller...
}
这应该是您的控制器 class 的 唯一构造函数 。控制器本身对 GAMontlySqlReader
或其任何依赖项一无所知。
GAMonthlySQLReader
也是如此 - 它将允许通过构造函数注入任何 ILogger
实现。
这个想法是它让应用程序的 composition root 负责如何将依赖项组合在一起,这意味着您可以稍后轻松地切换它们,而无需对您正在组合的组件进行任何更改。因此,Ninject 将在您的组合根内部使用以将类型映射到它们的抽象,然后将构建 对象图 所有这些依赖项组合在一起。
kernel.Bind<ILogger>().To<MyLoggerClass>();
kernel.Bind<IGAMonthlyReader>().To<GAMonthlySQLReader>();
对于每个应用程序服务,您将允许 Ninject 实例化它们(因此它可以提供依赖项)而不是在应用程序内部使用 new
关键字(new
可用于 DTO 和模型。
我认为您需要将 Ninject.Web.WebApi 使用 nuget 添加到您的 Web Api 项目中。然后使用 Ninject 创建 Api 控制器:
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
并为 GAMonthlyAPIController 添加 Bind()。无需为您的控制器创建默认构造函数。
看看这个 post:
http://nodogmablog.bryanhogan.net/2016/04/web-api-2-and-ninject-how-to-make-them-work-together/
所以我正在研究 API 并将 Ninject 用于 DI 和 IoC。我知道使用 Ninject 的基本代码是如何工作的,但是在 类 之一的构造函数中,正在发送一个 Logger 对象。我不想在构造函数设计项中发送它,而是想在 NinjectWebCommon.cs
文件中传递它。
public GAMonthlyAPIController() : this(new GAMonthlySQLReader(new NullLogger()))
这是构造函数。
kernel.Bind<IGAMonthlyReader>().To<GAMonthlySQLReader>();
这是 NinjectWebCommon.cs
中的条目 我想将其绑定到 NinjectWebCommon.cs
而不是默认值。我将如何通过它?我什至不知道要搜索什么,所以我可以找到答案。
应用依赖注入模式最实用的方法是使用构造函数注入。这意味着 classes GaMonthlyAPIController
依赖应该通过构造函数传入,而不是在控制器内部硬编码。
public class GAMonthlyAPIController
{
private readonly IGAMonthlySQLReader gaMonthlySqlReader;
public GAMonthlyAPIController(IGAMonthlySQLReader gaMonthlySqlReader)
{
this.gaMonthlySqlReader = gaMontlySqlReader
?? throw new ArgumentNullException(nameof(gaMontlySqlReader));
}
// implementation of controller...
}
这应该是您的控制器 class 的 唯一构造函数 。控制器本身对 GAMontlySqlReader
或其任何依赖项一无所知。
GAMonthlySQLReader
也是如此 - 它将允许通过构造函数注入任何 ILogger
实现。
这个想法是它让应用程序的 composition root 负责如何将依赖项组合在一起,这意味着您可以稍后轻松地切换它们,而无需对您正在组合的组件进行任何更改。因此,Ninject 将在您的组合根内部使用以将类型映射到它们的抽象,然后将构建 对象图 所有这些依赖项组合在一起。
kernel.Bind<ILogger>().To<MyLoggerClass>();
kernel.Bind<IGAMonthlyReader>().To<GAMonthlySQLReader>();
对于每个应用程序服务,您将允许 Ninject 实例化它们(因此它可以提供依赖项)而不是在应用程序内部使用 new
关键字(new
可用于 DTO 和模型。
我认为您需要将 Ninject.Web.WebApi 使用 nuget 添加到您的 Web Api 项目中。然后使用 Ninject 创建 Api 控制器:
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
并为 GAMonthlyAPIController 添加 Bind()。无需为您的控制器创建默认构造函数。
看看这个 post: http://nodogmablog.bryanhogan.net/2016/04/web-api-2-and-ninject-how-to-make-them-work-together/