.net 洋葱模型

洋葱架构

  1. 内层部分比外层更抽象(内层接口,外层实现)。
  2. 外层的代码只能调用内层的代码,内层的代码可以通过依赖注入的形式来间接调用外层的代码

简单的例子,引用依赖图
在这里插入图片描述

demo

  1. 接口类库
    EmailInfo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Intf
{
   
    public class EmailInfo
    {
   
        public string Email {
    get; set; }

        public string Subject {
    get; set; }

        public string Body {
    get; set; }

        public EmailInfo(string email,string subject,string body)
        {
   
            Email = email;  
            Subject = subject;
            Body = body;
        }
    }
}

IGenerateMessage

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Intf
{
   
    public interface IGenerateMessage
    {
   
        public IEnumerable<EmailInfo> GenerateEmail();
    }
}

ISendMessage

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Intf
{
   
    public interface ISendMessage
    {
   
        public Task SendMessageAsync(EmailInfo emailInfo);
    }
}

Mybusiness 这是实现业务的地方,注入两个接口,一个是获取数据,一个是发送信息,实现均在控制台工程实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Intf
{
   
    public class Mybusiness
    {
   
        public IGenerateMessage GenerateMessage {
    get; set; }

        public ISendMessage SendMessage {
    get; set; }
        public Mybusiness(IGenerateMessage generateMessage, ISendMessage sendMessage)
        {
   
            GenerateMessage = generateMessage;
            SendMessage = sendMessage;
        }
        public async Task DoIt()
        {
   
            var items = GenerateMessage.GenerateEmail();

            foreach (var item in items)
            {
   
                await SendMessage.SendMessageAsync(item);
                await Task.Delay(1000);
            }
        }
    }
}

  1. 控制台工程
    GenerateMessage
using Intf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Onion
{
   
    internal class GenerateMessage : IGenerateMessage
    {
   
        public IEnumerable<EmailInfo> GenerateEmail()
        {
   
            for (int i = 0; i < 5; i++)
            {
   
                yield return new EmailInfo("1.com", "你好", "你好");
            }
        }
    }
}

MyEmailSender

using Intf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Onion
{
   
    internal class MyEmailSender : ISendMessage
    {
   
        public Task SendMessageAsync(EmailInfo emailInfo)
        {
   
            Console.WriteLine($"{
     emailInfo.Email} {
     emailInfo.Subject} {
     emailInfo.Body}");
            return Task.CompletedTask;
        }
    }
}

program

//依赖注入
using Intf; //类库名称
using Microsoft.Extensions.DependencyInjection;//
using Onion;//控制台工程名称

ServiceCollection service =  new ServiceCollection();

service.AddScoped<IGenerateMessage, GenerateMessage>();

service.AddScoped<ISendMessage, MyEmailSender>();

service.AddScoped<Mybusiness>();
var sp =  service.BuildServiceProvider();

Mybusiness business = sp.GetRequiredService<Mybusiness>();

business.DoIt();


Console.WriteLine("Hello, World!");

相关推荐

  1. onion洋葱模型

    2023-12-13 07:28:03       10 阅读
  2. <span style='color:red;'>net</span><span style='color:red;'>模块</span>

    net模块

    2023-12-13 07:28:03      12 阅读
  3. 理解C#和.NET的应用模型

    2023-12-13 07:28:03       20 阅读
  4. 【.NET Core】异步编程模式

    2023-12-13 07:28:03       32 阅读
  5. BERT 微调中文 NER 模型

    2023-12-13 07:28:03       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 07:28:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 07:28:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 07:28:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 07:28:03       18 阅读

热门阅读

  1. React Context:跨层级组件共享状态参数、状态

    2023-12-13 07:28:03       35 阅读
  2. k8s 安装firewalld导致的网络疑难问题处理

    2023-12-13 07:28:03       36 阅读
  3. vue-socket.io以及原生websocket的使用

    2023-12-13 07:28:03       28 阅读
  4. http 与 websocket

    2023-12-13 07:28:03       37 阅读
  5. GEE(ccdc)——连续变化检测和分类 (CCDC)概述

    2023-12-13 07:28:03       33 阅读
  6. ElasticSearch高可用集群搭建

    2023-12-13 07:28:03       34 阅读
  7. Redis-分片集群大纲

    2023-12-13 07:28:03       35 阅读