使用和不使用框架依赖注入的注入方式

下面将为展示四个完整的控制台例子,分别展示如何在使用依赖注入框架和不使用依赖注入框架的情况下,进行属性注入和方法注入。

### 1. 使用依赖注入框架的属性注入方式

我们继续使用 .NET Core 的内置依赖注入框架来实现属性注入。

```csharp
using System;
using Microsoft.Extensions.DependencyInjection;

namespace DIExample
{
    // 定义 Mailable 接口
    interface Mailable
    {
        void Send();
    }

    // 实现 Mailable 接口的具体类
    class Email : Mailable
    {
        public void Send()
        {
            Console.WriteLine("发送邮件通知用户");
        }
    }

    // 订单类
    class Order
    {
        [ActivatorUtilitiesConstructor]
        public Order() {}

        // 属性注入
        public Mailable Mail { get; set; }

        public void Complete()
        {
            Console.WriteLine("订单已完成,状态已更新");
            Mail?.Send();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var serviceProvider = new ServiceCollection()
                .AddTransient<Mailable, Email>()
                .AddTransient<Order>()
                .BuildServiceProvider();

            var order = serviceProvider.GetService<Order>();
            order.Mail = serviceProvider.GetService<Mailable>();

            order.Complete();
            Console.ReadLine();
        }
    }
}
```

### 2. 使用依赖注入框架的方法注入方式

```csharp
using System;
using Microsoft.Extensions.DependencyInjection;

namespace DIExample
{
    interface Mailable
    {
        void Send();
    }

    class Email : Mailable
    {
        public void Send()
        {
            Console.WriteLine("发送邮件通知用户");
        }
    }

    class Order
    {
        [ActivatorUtilitiesConstructor]
        public Order() {}

        public void Complete(Mailable mail)
        {
            Console.WriteLine("订单已完成,状态已更新");
            mail.Send();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var serviceProvider = new ServiceCollection()
                .AddTransient<Mailable, Email>()
                .AddTransient<Order>()
                .BuildServiceProvider();

            var order = serviceProvider.GetService<Order>();
            var mail = serviceProvider.GetService<Mailable>();

            order.Complete(mail);
            Console.ReadLine();
        }
    }
}
```

### 3. 不使用框架的属性注入方式

```csharp
using System;

namespace DIExample
{
    interface Mailable
    {
        void Send();
    }

    class Email : Mailable
    {
        public void Send()
        {
            Console.WriteLine("发送邮件通知用户");
        }
    }

    class Order
    {
        // 属性注入
        public Mailable Mail { get; set; }

        public void Complete()
        {
            Console.WriteLine("订单已完成,状态已更新");
            Mail?.Send();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Order order = new Order();
            order.Mail = new Email();

            order.Complete();
            Console.ReadLine();
        }
    }
}
```

### 4. 不使用框架的方法注入方式

```csharp
using System;

namespace DIExample
{
    interface Mailable
    {
        void Send();
    }

    class Email : Mailable
    {
        public void Send()
        {
            Console.WriteLine("发送邮件通知用户");
        }
    }

    class Order
    {
        public void Complete(Mailable mail)
        {
            Console.WriteLine("订单已完成,状态已更新");
            mail.Send();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Order order = new Order();
            Mailable mail = new Email();

            order.Complete(mail);
            Console.ReadLine();
        }
    }
}
 

这四个例子分别展示了在使用和不使用依赖注入框架的情况下,进行属性注入和方法注入的方法。

总结一下:
1. 使用框架的属性注入和方法注入更为简洁,但需要了解和配置框架。
2. 不使用框架的属性注入和方法注入则更为直接,适用于简单场景或对框架不熟悉的情况下。

### 使用依赖注入框架的构造函数注入方式

using System;
using Microsoft.Extensions.DependencyInjection;

namespace DIExample
{
    interface IMailable
    {
        void Send();
    }

    class Email : IMailable
    {
        public void Send()
        {
            Console.WriteLine("发送邮件通知用户");
        }
    }

    class Order
    {
        private readonly IMailable _mail;

        // 构造函数注入
        public Order(IMailable mail)
        {
            _mail = mail;
        }

        public void Complete()
        {
            Console.WriteLine("订单已完成,状态已更新");
            _mail.Send();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var serviceProvider = new ServiceCollection()
                .AddTransient<IMailable, Email>()
                .AddTransient<Order>()
                .BuildServiceProvider();

            var order = serviceProvider.GetService<Order>();
            order.Complete();
            Console.ReadLine();
        }
    }
}
 

### 不使用依赖注入框架的构造函数注入方式

using System;

namespace DIExample
{
    interface IMailable
    {
        void Send();
    }

    class Email : IMailable
    {
        public void Send()
        {
            Console.WriteLine("发送邮件通知用户");
        }
    }

    class Order
    {
        private readonly IMailable _mail;

        // 构造函数注入
        public Order(IMailable mail)
        {
            _mail = mail;
        }

        public void Complete()
        {
            Console.WriteLine("订单已完成,状态已更新");
            _mail.Send();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IMailable mail = new Email();
            Order order = new Order(mail);

            order.Complete();
            Console.ReadLine();
        }
    }
}
 

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值