Mais conteúdo relacionado
Semelhante a CleanArchitecture with AssemblyDefinition in unity (20)
CleanArchitecture with AssemblyDefinition in unity
- 4. Clean Architecture
• Clean Architecture for Unity
• @monry
• https://learning.unity3d.jp/4021/
• Unityでオニオンアーキテクチャ
• @toRisouP
• https://www.slideshare.net/torisoup
/unity-14815173
- 17. MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
UseCase
アプリケーションでしたいこと
Presenterを介してUIの入力/表示を実装
Repositoryを介してDataのIOを実装
UniRxが便利
public class UseCase : IUseCase {
readonly IPresenter presenter;
readonly IRepository repository;
public UseCase(IPresenter presenter,
IRepository repository) {
this.presenter = presenter;
this.repository = repository;
}
void IUseCase.Begin() {
// ボタンが押された回数を保存みたいな
}
void IUseCase.Finish() {
// 終了処理
}
}
- 18. MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
IPresenter/IReposiotry
UseCaseが参照するUIやデータを操作
するための停止
UseCase(したいこと)があってこいつら
が決まるので、Domain層の住人
public interface IPresenter {
IObservable<Unit> ClickObs {get;}
void SetText(string text);
}
public interface IRepository {
void SetCount(int count);
int GetCount();
}
データのI/Oを非同期にしたいなら
UniTaskも選択肢
- 19. MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
Presenter/Reposiotry
実際に処理を行う奴らとUseCaseの仲介
こいつらも詳細は知らない
いわゆる腐敗防止層(?)
public class Presenter : IPresenter {
readonly IView view;
public Presenter(IView view) {
this.view = view;
}
public IObservable<Unit> ClickObs =>
view.Button.OnClickObservable();
public void SetText(string text) {
view.Text.text = text;
}
}
public interface IView {
Button Button {get;}
Text Text {get;}
}
- 20. MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
View/DataStore
実際に処理を行う奴ら
外部フレームワークに依存しまくってOK
ここを変えてもアプリケーションの
ロジックに影響はなし
public class View : MonoBehaviour, IView {
[SerializeField] Button button = default;
[SerializeField] Text text = default;
public Button Button => button;
public Text Text => text;
}
public class DataStore : IDataStore {
public void SaveCount(int count) {
PlayerPrefs.SetInt("count", count);
}
public int LoadCount() {
return PlayerPrefs.GetInt("count", 0);
}
}
- 21. MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
Main
PresenterやRepositoryの実装を
(どうにかして)受け取り、
UseCaseの作成/実行/破棄を行う。
MonoBehaviourを継承し、Unityのライ
フサイクルにのせる。
public class Main : MonoBehaviour {
IUseCase usecase;
[Inject]
Construct(IPresenter presenter,
IRepository repository) {
usecase = new UseCase(
presenter, repository);
}
void Awake() {
usecase.Begin();
}
void OnDestroy() {
usecase.Finish();
}
}
- 22. MainInstaller
UseCase
IPresenter IRepository
Presenter Repository
IView IDataStore
View DataStore
所持
依存 依存
依存依存
実装実装
実装 実装
DI
UI Data
Frameworks & Drivers
-Detail-
Interface Adapter
-Adapter-
App Business Rule
-Domain-
Installer
Zenject.MonoInstallerを継承
あるinterfaceを要求された時に返すクラ
スやインスタンスを事前に定義できる
全ての定義を知る存在
public class Installer : MonoInstaller {
[SerializeField] View view;
[SerializeField] DataStore dataStore;
public override void InstallBindings() {
Container
.Bind<IPresenter>()
.FromInstance(new Presenter(view))
.AsCached();
Container
.Bind<IRepository>()
.FromInstance(new Repository(dataStore))
.AsCached();
}
}