ファクトリークラスを生成するソースコードジェネレータ。
namespace Sample
{
class Service {}
class Client
{
public Client(Service service) {}
}
[Deptorygen.Annotations.Factory]
interface IFactory
{
Service ResolveService();
Client ResolveClient();
}
}
// <autogenerated />
#nullable enable
using System;
using System.Collections.Generic;
namespace Sample
{
internal partial class Factory : IFactory
, IDisposable
{
private Service? _ResolveServiceCache;
private Client? _ResolveClientCache;
public Factory()
{
}
public Service ResolveService()
{
return _ResolveServiceCache ??= new Service();
}
public Client ResovleClient()
{
return _ResolveClientCache ??= new Client(ResolveService());
}
public void Dispose()
{
}
}
}
Client
クラスは Service
クラスをコンストラクタで要求します。
この2つのクラスをnewする際の煩わしい依存関係解決をコード生成に任せます。
IFactory
インターフェースに Factory
属性を付けることで、
このインターフェースからファクトリークラスを生成するよう指定しています。
IFactory
インターフェースの持っているメソッドは、生成されるクラスによって実装されます。
戻り値の型として指定されたクラス群は、それぞれ依存関係を解決した状態で生成され、キャッシュされます。
この例では、Client
クラスを生成する部分のコードにて、そのコンストラクタにClient
クラスの依存先である
Service
クラスのインスタンスを与えるようなコードが自動で生成されます。
DeptorygenはC#コードに対してアナライザーとCodeFixを提供することで、 クラス間の依存関係を解決しながらインスタンスを生成するDIコンテナの役割を果たします。
プロジェクト名は「Dependency Factory Generator」の略です。
Nuget Galleryにて、以下のパッケージをインストールしてください。
- Deptorygen
- Deptorygen.Annotations
GenericHostとの連携機能が必要であれば、以下のパッケージもインストールしてください。
- Deptorygen.GenericHost
Visual Studio 2019で動作確認しています。
動作させるために、%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\Common7\IDE
に .NET Framework向けの netstandard.dll
を配置する必要があります。
このDLLは恐らく、 %ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\nestandard.dll
にあります。
Deptorygenパッケージをプロジェクトにインストールしたら、まずはVisual Studioを再起動する必要があります。
再起動後、[Factory]
属性がついているインターフェースに対して出るクイックヒント(電球マーク💡)を通じてコード生成を実行することができます。
リポジトリ内のマニュアルをご覧ください。