.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 天前
BGE-M3 多语言向量模型实战:.NET C# 从原理到落地
开发语言·c#·.net
武藤一雄2 天前
C#万字详解 栈与托管堆 的底层逻辑
windows·microsoft·c#·.net·.netcore
波波0072 天前
.NET真的被上海信创排除在外?
.net
武藤一雄2 天前
深入拆解.NET内存管理:从GC机制到高性能内存优化
windows·microsoft·c#·.net·wpf·.netcore·内存管理
江沉晚呤时2 天前
深入理解 Akka.NET:高并发与分布式系统的利器
开发语言·c#·.net
江沉晚呤时2 天前
C# 高级多态揭秘:从虚函数表到性能优化实战
开发语言·c#·.net
追雨潮2 天前
CLIP 多模态搜索实战:.NET + Python 跨语言图片检索
开发语言·python·.net
追雨潮2 天前
从内存到 ES:.NET 企业级向量检索架构演进之路
elasticsearch·架构·.net
无风听海2 天前
.NET10之HttpContext.RequestServices 深入解析
.net·asp.net core