.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!");
相关推荐
时光追逐者16 小时前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
前端·microsoft·开源·c#·.net·layui·.netcore
friklogff17 小时前
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
开发语言·c#·.net
@Unity打怪升级1 天前
【C#】CacheManager:高效的 .NET 缓存管理库
开发语言·后端·机器学习·缓存·c#·.net·.netcore
yufei-coder2 天前
.Net 9与AI开发
人工智能·.net
孟章豪2 天前
深入理解.NET中的委托与事件:实现灵活的事件驱动编程
.net
小彰4 天前
.Net 6.0 Windows平台如何判断当前电脑是否联网
windows·.net
小码编匠4 天前
.NET 中的表达式树(Expression Trees)
后端·c#·.net
编程乐趣4 天前
tesseract:一个.Net版本的开源OCR项目
ocr·.net
MicrosoftReactor5 天前
技术速递|适用于 .NET 和 .NET MAUI Android 应用程序的 Android 资产包
android·.net
AitTech5 天前
解析.NET框架与平台:构建高效应用程序的基石
.net