前提
C#でASP.Netを用いてWebアプリケーションを構築しようとしています。
レイヤードアーキテクチャに従い、プロジェクトを以下の4つに分けました。
- Presentation(ASP.NETで作成したものでViewを保持)
- 参照:Application
- Application(Controllerを保持)
- 参照:Domain
- Domain(Entity/Service/IRepositoryを保持)
- 参照:なし
- Infrastructure(Repositoryを保持)
- 参照:Domain
ServiceクラスにはIRepositoryを受け取るコンストラクタを用意し、
Infrastructureの実装クラスをDIにて挿入すればよいというところまでは理解したのですが、
このDIに関する設定(コンテキスト)はどのレイヤーで生成すれ良いのかが分かりません。
該当のソースコード
C#
1public interface IHogehogeRepository : IDisposable 2{ 3 : 4}
C#
1public class HogehogeService : IHogehogeService 2{ 3 private readonly IHogehogeRepository _hogehogeRepository; 4 public HogehogeService (IHogehogeRepository hogehogeRepository) 5 { 6 _hogehogeRepository = hogehogeRepository 7 } 8 : 9}
C#
1public class HogehogeSQLServerRepository : IHogehogeRepository 2{ 3 : 4}
試したこと
autofacを用いて以下の2クラスを用意し、
としてこれをGlobal.asaxのApplication_Start()から呼び出すことで
DI自体が機能するのことまでは確認できました。
ただこの場合、IHogehogeRepositoryインターフェイスとHogehogeSQLServerRepositoryクラスを参照するために
PresentationプロジェクトにDomainとInfrastructureの参照を追加する必要がありました。
DIの設定のためとはいえこれら2つの参照を追加する必要があるのかという点が疑問です。
上記のような場合、DIに関する設定はPresentationプロジェクトに入れるのが正しいのか
それともApplicationプロジェクトにInfrastructureへの参照を追加して入れるのが正しいのかどちらでしょうか?
あるいは他の手段を用いるべきなのでしょうか?
ご教示いただけますと幸いです。
C#
1public class Dependency : IDependencyResolver 2{ 3 private readonly IContainer container; 4 public Dependency(IContainer container) 5 { 6 this.container = container; 7 } 8 9 public object GetService(Type serviceType) 10 { 11 return container.IsRegistered(serviceType) ? container.Resolve(serviceType) : null; 12 } 13 14 public IEnumerable<object> GetServices(Type serviceType) 15 { 16 Type enumerableServiceType = typeof(IEnumerable<>).MakeGenericType(serviceType); 17 18 object instance = container.Resolve(enumerableServiceType); 19 20 return ((IEnumerable)instance).Cast<object>(); 21 } 22}
C#
1internal class DependencyConfigure 2{ 3 public static void Initialize() 4 { 5 var builder = new ContainerBuilder(); 6 DependencyResolver.SetResolver(new Dependency(RegisterServices(builder))); 7 } 8 9 private static IContainer RegisterServices(ContainerBuilder builder) 10 { 11 builder.RegisterAssemblyTypes(typeof(Global).Assembly).PropertiesAutowired(); 12 13 builder.RegisterType<HogehogeSQLServerRepository>().As<IHogehogeRepository>(); 14 15 return builder.Build(); 16 } 17}
補足情報(FW/ツールのバージョンなど)
.Net Framework 4.8
VisualStudio Community 2022 Version 17.3.1
Autofac 6.4.0
回答1件
あなたの回答
tips
プレビュー