.net 洋葱模型

洋葱架构

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

简单的例子,引用依赖图

demo

  1. 接口类库
    EmailInfo
csharp 复制代码
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

csharp 复制代码
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

csharp 复制代码
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 这是实现业务的地方,注入两个接口,一个是获取数据,一个是发送信息,实现均在控制台工程实现

csharp 复制代码
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
csharp 复制代码
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

csharp 复制代码
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

csharp 复制代码
//依赖注入
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!");
相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
_Jonas3 天前
.net framework开发环境正式环境配置文件的切换
.net·wpf
Y3815326624 天前
C# 调用谷歌搜索 API:HttpClient 与 System.Text.Json 实战
搜索引擎·.net
qq_410194295 天前
.NET 8.0 下基于 PaddleOCRSharp 的离线文字识别落地指南
算法·.net
唐青枫6 天前
别急着拆服务:C#.NET 微服务架构从边界设计到实战
c#·.net
唐青枫7 天前
别把 Razor 当成几段 HTML:C#.NET Razor Pages、MVC 视图与实战详解
c#·.net
宝桥南山8 天前
Microsoft Fabric - 简单尝试一下Microsoft Fabric .NET SDK
microsoft·微软·.net·.netcore·powerbi·fabric
Lost of 程序猿8 天前
.NET 10 船端单机部署与离线升级实战:从闪退事故到无感回滚
c#·asp.net·.net
慧都小妮子8 天前
Word/Excel/PPT 如何稳定导出 Markdown?文档 SDK 三线能力拆解
.net·markdown·知识库·aspose·rag·文档转换·文档互操作
唐青枫8 天前
对象到底住在哪里?C#.NET 托管堆从分配、GC 到内存排查
c#·.net