采猬 2023-06-30 13:39 采纳率: 66.7%
浏览 13
已结题

c# 控制台项目IOC容器

c# 的控制台项目有没有可能像java 的spring boot batch一样,有全局的IOC容器?

  • 写回答

2条回答 默认 最新

  • wanghui0380 2023-06-30 14:48
    关注

    额,net4.62以上就可以用,这是必须告诉你的(某园子可不会告诉你,他们只会告诉你abp无敌,vnext 千岁)
    使用方法,其实你就可以参考netcore的asp.net core mvc项目。

    查找资料需要点技巧,因为某园子没事带歪的特性决定你查找中文资料的时候一定需要限定关键词,不然总会被某园子的博文给带歪的
    所以查找资料的关键词是 “netcore 通用主机 Generalhost”
    关键词解释:
    netcore-----------因为某园子不会告诉你net4.62,他们喜欢故意歪到netcore,所以你要查中文资料得限制到netcore,不然你查不到,当然netcore的资料没关系,他跟netcore代码基本互通。
    通用主机 Generalhost-------官方名称为Generalhost,中文翻译为通用主机。 我们必须这样限定关键词,你要直接查所谓IOC,以那个园子的歪楼风,一定会歪到abp,abp.vnetxt那边的

    那么如何使用,我给个基础的代码,其他你自己研究
    1.新建net4.62控制台
    2.
    nuget Microsoft.Extensions.Hosting (hosting 是全的,你也可以按需分项下载,不过我一般图省事,直接nuget这库)

    1. 代码为:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    
    namespace ConsoleApp2
    {
    
        public class Program
        {
            static async Task Main(string[] args)
            {
                HostBuilder hb = new HostBuilder();
                hb.ConfigureServices(service =>
                {
                    //这里就是注入配置控制部分,当然很多自己实现的框架能实现自动扫描注入那是后话
                    //我们只是简单demo就直接手动配置了
    
                    //这里会有生存期控制,简单demo我就不展示生存期了,直接配置一个单件的
                    service.AddSingleton<待注入的class>();
                    service.AddHostedService<启动入口>();
    
                });
                //后面我需要用日志打印,所以我这里也配置日志项目
                hb.ConfigureLogging(log =>
                {
                   
                    //我想在控制台输出日志,所以加了一个控制台日志输出
                    log.AddConsole();
                });
    
                //根据配置启动通用主机
                using (var host=await hb.StartAsync())
                {
                    //等待主机Shutdown
                    await host.WaitForShutdownAsync();
                }
            }
    
           public class 启动入口:IHostedService
            {
                private readonly 待注入的class _obj;
                private readonly ILogger<启动入口> _logger;
    
                //构造注入
                //hosting 默认也带日志注入的,故我这里直接注入日志
                public 启动入口(待注入的class obj,ILogger<启动入口> logger)
                {
                    _obj = obj;
                    _logger = logger;
                }
                public async Task StartAsync(CancellationToken cancellationToken)
                {
                    string msg = _obj.A;
                    _logger.LogInformation(msg);
                }
    
                public async Task StopAsync(CancellationToken cancellationToken)
                {
                    
                    
                }
            }
    
           public class 待注入的class
           {
             
               public string A { get; set; } = "我是待注入的class实例的属性A";
           }
        }
    }
    
    
    
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月8日
  • 已采纳回答 6月30日
  • 创建了问题 6月30日