8. namespaceを活用する
アーキテクチャのレイヤーをコード上で明確にするために、C#のnamespace機能を活用しましょう。namespaceはクラスをグループ化する仕組みで、どのクラスがどのレイヤーに属しているかをコード上で明示できます。
csharp
// Domain層のクラス
namespace MyGame.Domain
{
public class ScoreModel { /* ... */ }
public class DamageCalculator { /* ... */ }
public class BattleService { /* ... */ }
public interface IScoreRepository { /* ... */ }
}
// Application層のクラス
namespace MyGame.Application
{
using MyGame.Domain; // Domain層だけを参照する ✅
public class DefeatEnemyUseCase { /* ... */ }
public class StartGameUseCase { /* ... */ }
public class FinishGameUseCase { /* ... */ }
public interface IGameOverPort { /* ... */ }
}
// Presentation層のクラス
namespace MyGame.Presentation
{
using MyGame.Application; // Application層を参照する ✅
using MyGame.Domain;
// using MyGame.Infrastructure; ← これはダメ!同じ層や外側の層に依存してはいけない
public class ScoreView : MonoBehaviour { /* ... */ }
public class ScorePresenter { /* ... */ } // Pure C#!
public class GameOverPresenter : IGameOverPort { /* ... */ }
}
// Infrastructure層のクラス
namespace MyGame.Infrastructure
{
using MyGame.Domain; // Domain層を参照する ✅
public class JsonScoreRepository : IScoreRepository { /* ... */ }
}
// CompositionRoot層のクラス
namespace MyGame.CompositionRoot
{
using MyGame.Domain; // 全層を参照 ✅(特権)
using MyGame.Application;
using MyGame.Presentation;
using MyGame.Infrastructure;
public class GameLifetimeScope : LifetimeScope { /* ... */ }
}namespaceを使うことで、クラスがどのレイヤーに属して、どのレイヤーに依存しているかが明らかになります。また、異なるnamespaceに同名のクラスが存在しても衝突することがありません。