Winform窗体使用IOC容器

这篇具有很好参考价值的文章主要介绍了Winform窗体使用IOC容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Winform窗体如何使用IOC容器呢?在nuget中添加Microsoft.Extensions.DependencyInjection

接着在Program类Main方法中添加一下代码

                // 创建服务集
                Build();
                using (FmLogin fl = ServiceProvider.GetRequiredService<FmLogin>())
                {
                    fl.ShowDialog();
                    if (fl.DialogResult == DialogResult.OK)
                        Application.Run(ServiceProvider.GetRequiredService<FmMain>());
                }

在此类中继续补充以下代码

         /// <summary>
        ///  服务容器
        /// </summary>
        static IServiceCollection Services { get; set; }
        /// <summary>
        /// 服务管理者
        /// </summary>
        static IServiceProvider ServiceProvider { get; set; }
        static void Build()
        {
            // 创建服务容器
            Services = new ServiceCollection();
            // 添加服务注册
            ConfigureServices(Services);
            // 创建服务管理者
            ServiceProvider = Services.BuildServiceProvider();
        }
        /// <summary>
        /// 注入服务
        /// </summary>
        /// <param name="services"></param>
        static void ConfigureServices(IServiceCollection services)
        {
            // 注入日志
            services.AddSingleton(typeof(ILogFactory<>),typeof(LogFactory<>));
            // 注入窗体
            RegisterForm();
            // 注入IniHelper
            services.AddScoped<IIniHelper, IniHelper>();


        }
        #region 注入窗体-开始
        static void RegisterForm()
        {
            Type[]? types = Assembly.GetExecutingAssembly()?.GetExportedTypes();
            if (types != null)
            {
                var descType = typeof(FormMarkAttribute);
                var form = typeof(Form);
                foreach (Type type in types)
                {
                    // 类型是否为窗体,否则跳过,进入下一个循环
                    //if (type.GetTypeInfo != form)
                    //    continue;

                    // 是否为自定义特性,否则跳过,进入下一个循环
                    if (!type.IsDefined(descType, false))
                        continue;
                    // 强制为自定义特性
                    FormMarkAttribute? attribute = type.GetCustomAttribute(descType, false) as FormMarkAttribute;
                    // 如果强制失败或者不需要注入的窗体跳过,进入下一个循环
                    if (attribute == null || !attribute.IsIOC)
                        continue;
                    // 域注入
                    Services.AddScoped(type);
                    Console.WriteLine($"注入:{attribute.FormType.Namespace}.{attribute.FormType.Name},{attribute.Describe}");
                }
            }
        }
        #endregion 注入窗体-结束

以后你的注入只需要在 static void ConfigureServices(IServiceCollection services)这个方法中注入就行了

全景图:

winform ioc,microsoft,c#

 winform ioc,microsoft,c#

我把窗体也注入了,不过不是全部注入,是标记的并且是需要注入的,我们看FormMarkAttribute源码:

    /// <summary>
    /// Form窗体标记
    /// </summary>
    [AttributeUsage(AttributeTargets.Class)]
    public class FormMarkAttribute : Attribute
    {
        /// <summary>
        /// 描述内容
        /// </summary>
        public string Describe { get; private set; }
        /// <summary>
        /// 是否运行注入,默认false
        /// </summary>
        public bool IsIOC { get; private set; }
        /// <summary>
        /// 窗体类型
        /// </summary>
        public Type FormType { get; private set; }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="type">窗体反射类型</param>
        public FormMarkAttribute(Type type)
        {
            this.FormType = type;
            this.IsIOC = false;
            this.Describe =String.Empty;
        }
        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="type">窗体反射类型</param>
        /// <param name="describe">窗体描述</param>
        public FormMarkAttribute(Type type, string describe)
        {
            this.Describe = describe;
            this.IsIOC = false;
            this.FormType = type;
        }
        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="type">窗体反射类型</param>
        /// <param name="describe">是否需要注入</param>
        public FormMarkAttribute(Type type, bool isIOC)
        {
            this.Describe = String.Empty;
            this.IsIOC = isIOC;
            this.FormType = type;
        }
        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="type">窗体反射类型</param>
        /// <param name="describe">窗体描述</param>
        /// <param name="isIOC">是否需要注入</param>
        public FormMarkAttribute(Type type,string describe,bool isIOC)
        {
            this.Describe = describe;
            this.IsIOC = isIOC;
            this.FormType = type;
        }
    }

使用:

winform ioc,microsoft,c#

winform ioc,microsoft,c#

注意我的窗体继承的是FmCommonForm而不是Form,因为我可以在FmCommonForm里面写很多公共需要的方法、属性等;比如:全部窗体的icon图标,加载等待窗体等待。如下

winform ioc,microsoft,c#

需要源码的滴滴。。。 文章来源地址https://www.toymoban.com/news/detail-523636.html

到了这里,关于Winform窗体使用IOC容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringBoot 如何使用 IOC 容器

    SpringBoot 如何使用 IOC 容器

    Spring 是一个非常流行的 Java 开发框架,它提供了一个强大的 IoC(Inversion of Control)容器来管理 Java 对象之间的依赖关系。在 SpringBoot 中,我们可以非常方便地使用这个 IoC 容器来管理我们的 Java 对象,本文将介绍 SpringBoot 中如何使用 IoC 容器。 IoC 容器是 Spring 框架的核心,它

    2024年02月09日
    浏览(7)
  • wpf 在MVVM中使用IOC思想通过注册窗体的方法实现在ViewModel里面打开其他窗口的方法

    理论:在MVVM中,View通过添加ViewModel的引用来指定DataContext,也就是View可以引用ViewModel,但ViewModel不可以引用View,而ViewModel在实现逻辑过程中如果需要访问其他的窗体该怎么办呢,比如打开一个对话框,这里通过IOC思想来解决该问题。 1 新建wpf应用 2 新建Views,Models,ViewModel

    2024年02月12日
    浏览(10)
  • winform窗体

    WinForm,是·Net开发平台中对Windows Form的一种称谓。WinForm是窗体应用程序,由若干个窗体应用组成,基于C/S架构 (1)基本控件: label 文本提示 TextBox 文本框 button      按钮 radiobutton 单选按钮 panel       面板(相当于小容器) check 复选框 combox        下拉列表框 listbox  列表

    2024年02月08日
    浏览(29)
  • 【C#】【WinForm】MDI窗体

    【C#】【WinForm】MDI窗体

    MDI窗体的相关学习使用 1、设置MDI父窗体  在属性中找到IsMdiContainer选项,设置为True 2、添加MDI子窗体,在项目中依次选择添加-窗体,然后一直默认即可  添加后的项目目录(Form1为父窗口,Form2、Form3为子窗口)  3、在Form1.cs中,创建对应MDI子窗口的对象并调用显示出来 保存

    2024年02月08日
    浏览(14)
  • winform窗体闪烁问题解决方式

    winform窗体闪烁问题解决方式 1、使用窗体双缓冲 SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles(); 窗体的DoubleBuffered 指示是否对控件进行双缓存处理。 2、使用CreateParams的使用解决闪屏问题

    2024年02月12日
    浏览(13)
  • C#Winform圆角无毛刺窗体实例

    本篇实例讲解窗体的圆角实现,对比了多种方法,最后一种实现了无毛刺的圆角窗体。 通过绘制圆角的路径,并创建对应的窗体Region区域实现,重新创建Region的所有方法,产生的Region都是有锯齿的,其效果一般,不能满足较高需求的项目。 目录 常规实现 方法一 常规实现  

    2024年02月11日
    浏览(44)
  • C#之基于winform窗体绘制简单图形

    C#之基于winform窗体绘制简单图形

    什么是窗体? 可以理解为是一个自定义的控制台应用程序。 假如需要仅仅是用vs制作游戏的话,那么vs中,我们平时所用到的控制台应用程序所呈现的窗口时远远不够用的。因此需要自定义窗体。 因此在新建项目时,我们不能再使用控制台应用程序,而是应该选择窗体: 之

    2023年04月16日
    浏览(9)
  • C# Winform无边框窗体实现界面拖动

    C# Winform无边框窗体实现界面拖动

    2024年02月07日
    浏览(14)
  • C# winform窗体全屏显示设置

    C# winform窗体全屏显示设置

    窗体全屏显示,并覆盖桌面任务栏。 全屏显示后,如果拖拽标题栏,会使窗体全屏失效(如果禁用了最大话按钮),为了解决这样的问题,需要设置“标题栏移动”属性:

    2024年02月16日
    浏览(14)
  • Winform中实现窗体控件适配(自适应窗体)布局_通过C#代码方式

    Winform中实现窗体控件适配(自适应窗体)布局_通过C#代码方式

    即:未启用控件缩放效果代码时,控件内容都是固定在窗体界面的指定位置,不会跟随窗体的拉伸,放大而进行适配,如下图所示: 即:启用控件缩放效果代码时,控件内容会跟随窗体的拉伸,放大而进行适配,如下图所示: 实现思路是: ①在窗体初始化时先获取窗体的宽

    2023年04月17日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包