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 容器

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

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

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

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

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

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

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

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

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

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

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

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

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

    2023年04月16日
    浏览(29)
  • C# winform窗体全屏显示设置

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

    2024年02月16日
    浏览(47)
  • C# Winform无边框窗体实现界面拖动

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

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

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

    2023年04月17日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包