Winformは依存注入を使用します。

Winformは依存注入を使用します。

Dependency Injection って何?依存性注入は特定のコーディングテクニックであり、コードの結合性を解決するために最も明白なものです。

最后更新 2022/04/22 7:21
AZRNG 鹏祥
预计阅读 3 分钟
分类
Winform
标签
.NET Winform 依存性注入。 IOC

ウェブマスター:Winform共有記事はあまりありませんが、この技術は比較的安定していますが、今日はWinform依存性注入記事を書いた他の番号を共有し、友人の関連開発を行うことを願って新しい経験を持っています。

1. プレゼンテーション:プレゼンテーション

Dependency Injection って何?依存性注入は特定のコーディングテクニックであり、コードの結合性を解決するために最も明白なものです。

2. 目的:目的

ASP.NET Coreではコンテナコンテナ自体が作成されており、コンテナにサービスを追加するだけですが、Winformではデフォルトで新しい方法で操作しています(私は. Net 6にアップグレードしましたが)。最近、オープンソースプロジェクトで独自の機能を追加しています。その後、元のNetFをNetCoreにアップグレードして、依存注入を試してみたいと思います。

C/Sコードはほとんど書かれておらず、間違っている場合は訂正するのが面倒。

3. オペレーション·オペレーション

この記事の環境例:VS2022、. Net 6、Windowsフォームアプリケーション

4. 準備中。

サンプルには次のコードが含まれます

  • フォーム1、フォーム2

  • Service:IUserservice、Userservice、IOrderService、OrderService

public interface IUserservice
{
    string GetName();
}

public class UserService : IUserservice
{
    public string GetName()
    {
        return "IUserservice";
    }
}

public interface IOrderService
{
    string GetName();
}

public class OrderService : IOrderService
{
    public string GetName()
    {
        return "IOrderService";
    }
}

5. シーンはこちら

Form1では、コンストラクタを介してIUserserviceを注入し、Loadイベント内でIUserserviceのGet nameメソッドを呼び出し、Pageボタンをクリックすると、Form2が依存性注入を介してIUserServiceがLoadイベント内でIUserServiceのGet nameメソッドを呼び出していることを示します。エラーなしで複数の操作ができれば成功です。

6. 開始する。

参照コンポーネント

<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />

Service ProviderHelperのアクションクラスを追加しました。

public static class ServiceProviderHelper
{
    /// <summary>
    /// 全局服务提供者
    /// </summary>
    public static IServiceProvider ServiceProvider { get; private set; } = null!;

    /// <summary>
    /// 初始化构建ServiceProvider对象
    /// </summary>
    /// <param name="serviceProvider"></param>
    /// <exception cref="ArgumentNullException"></exception>
    public static void InitServiceProvider(ServiceProvider serviceProvider)
    {
        ArgumentNullException.ThrowIfNull(serviceProvider, nameof(serviceProvider));

        ServiceProvider = serviceProvider;
    }

    /// <summary>
    /// 获取Form服务
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public static Form GetFormService(Type type)
    {
        var service = ServiceProvider.GetRequiredService(type);
        if (service is Form fService)
        {
            return fService;
        }
        else
        {
            throw new ArgumentException($"{type.FullName} is not a Form");
        }
    }

    /// <summary>
    /// 获取Form服务
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public static T GetService<T>() where T : class
    {
        return ServiceProvider.GetRequiredService<T>();
    }
}

Programメソッドの変更

internal static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    private static void Main()
    {
        //.net6写法 之前是三行合一行
        ApplicationConfiguration.Initialize();

        //创建服务容器
        var services = new ServiceCollection();
        //添加服务注册
        ConfigureServices(services);

        //构建ServiceProvider对象
        ServiceProviderHelper.InitServiceProvider(services.BuildServiceProvider());

        //获取指定服务
        var main = ServiceProviderHelper.ServiceProvider.GetRequiredService<Form1>();
        Application.Run(main);
    }

    /// <summary>
    /// 注入服务
    /// </summary>
    /// <param name="services"></param>
    public static void ConfigureServices(IServiceCollection services)
    {
        //批量注入可以使用Scrutor或者自己封装
        services.AddScoped<IUserservice, UserService>();
        services.AddScoped<IOrderService, OrderService>();

        //其他的窗体也可以注入在此处
        services.AddSingleton(typeof(Form1));
        services.AddTransient(typeof(Form2));
    }
}

フォーム1とフォーム2の両方に注入する。

private readonly IUserservice _userservice;

public Form1(IUserservice userservice)
{
    InitializeComponent();
    _userservice = userservice;
}

private readonly IOrderService _orderService;

public Form2(IOrderService orderService) : this()
{
    _orderService = orderService;
}

フォーム1ボタンをクリックしてフォーム2を表示します。

private void button1_Click(object sender, EventArgs e)
{
    var form2 = ServiceProviderHelper.GetFormService(typeof(Form2));
    form2.Show();
}

正常操作数回では異常は見られなかった。

7. 情報は

NET Core3.1 上でWinformベースの依存性注入インスタンスを実装するには、http//www.ty2y.com/study/znetcore3.1sjywinformsxylzrsl.html

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2024/02/29

Winformでもデータを表示できます。

winform開発の過程では、しばしばデータ表示機能を行う必要がありますが、以前はグリッドコントロールを使用していましたが、今日は例を通じて、Winform Blazorハイブリッドでant Design Blazorテーブルコンポーネントを使用してデータ表示を行う方法を紹介します。

继续阅读
同分类 / 同标签 2024/02/29

Winformのインターフェースも良く見えますか?

先日、winformでBlazorハイブリッドを使用することを紹介しましたが、Blazor UIを使用するとwinformプログラムがより良く見えるようになると述べました。次に、winform Blazorハイブリッドで描画する例を示したいと思います。

继续阅读