编辑
2025-09-27
C#
00

目录

摘要
正文
基本使用
场景一:基础依赖注入
场景二:构造函数注入
场景三:属性注入
场景四:条件绑定和上下文绑定

摘要

Ninject是一个开源的依赖注入容器,它通过自动满足对象之间的依赖关系来帮助我们构建松耦合的应用程序。Ninject使用了流畅的接口和Lambda表达式,使得依赖关系的设定既直观又易于管理。

正文

基本使用

在开始之前,你需要在项目中引入Ninject。通过NuGet包管理器搜索并安装Ninject即可。

image.png

场景一:基础依赖注入

假设我们有一个日志记录器接口和它的实现:

C#
public interface ILogger { void Log(string message); }
C#
public class ConsoleLogger : ILogger { public void Log(string message) { Console.WriteLine("Log: " + message); } }

我们的目标是在需要日志记录功能的类中注入ConsoleLogger。首先,我们需要定义一个Ninject模块:

C#
public class Bindings : NinjectModule { public override void Load() { Bind<ILogger>().To<ConsoleLogger>(); } }

接下来,在我们的应用程序中使用Ninject的标准内核来解析依赖关系:

C#
static void Main(string[] args) { var kernel = new StandardKernel(new Bindings()); var logger = kernel.Get<ILogger>(); logger.Log("Hello Ninject!"); }

image.png

场景二:构造函数注入

考虑一个需要日志记录器的UserService

C#
public class UserService { private readonly ILogger _logger; public UserService(ILogger logger) { _logger = logger; } public void CreateUser(string username) { // 创建用户的逻辑... _logger.Log($"User {username} was created."); } }

要通过Ninject注入ILogger,我们只需在Bindings模块中添加对UserService的绑定:

C#
public class Bindings : NinjectModule { public override void Load() { Bind<ILogger>().To<ConsoleLogger>(); Bind<UserService>().ToSelf(); } }

Ninject会自动将ConsoleLogger注入到UserService的构造函数中:

C#
static void Main(string[] args) { var kernel = new StandardKernel(new Bindings()); var userService = kernel.Get<UserService>(); userService.CreateUser("张三"); }

image.png

场景三:属性注入

如果我们想要通过属性而不是构造函数来注入依赖,我们可以使用Ninject的属性注入功能。

C#
public class PaymentService { [Inject] public ILogger Logger { get; set; } public void ProcessPayment(string user, decimal amount) { // 处理支付的逻辑... Logger?.Log($"Processed payment for {user} in the amount of {amount}."); } }

Bindings模块中,我们不需要做任何额外的工作,因为我们已经绑定了ILogger接口到ConsoleLogger实现:

C#
public override void Load() { Bind<ILogger>().To<ConsoleLogger>(); // PaymentService的绑定不是必需的,除非有特殊配置 }

当我们请求PaymentService实例时,Ninject将自动注入ILogger

C#
static void Main(string[] args) { var kernel = new StandardKernel(new Bindings()); var paymentService = kernel.Get<PaymentService>(); paymentService.ProcessPayment("张三", 10000); }

image.png

场景四:条件绑定和上下文绑定

有时候我们需要根据不同的条件来注入不同的实现。Ninject提供了强大的条件绑定功能。

假设我们有两个ILogger的实现,一个用于开发环境,一个用于生产环境:

C#
public class FileLogger : ILogger { public void Log(string message) { // 将日志写入文件... } }

我们可以在Bindings模块中使用条件绑定:

C#
public override void Load() { Bind<ILogger>().To<ConsoleLogger>().When(request => IsDevelopmentEnvironment()); Bind<ILogger>().To<FileLogger>().When(request => !IsDevelopmentEnvironment()); }
C#
private bool IsDevelopmentEnvironment() { // 这里可以是环境变量检查或其他逻辑 return true; }

Ninject会根据当前环境注入正确的ILogger实现。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!