ウェブマスター: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