80839


ASP.NET Core MVC（.NET
5）においてDIは、Controllerのコンストラクタインジェクションと、Viewのインジェクションをサポートしています。

Applicationの構成が下記のような階層を持っており、Skinny Controller, Fat
Modelのパターンを適用している場合を想定します。  
Controller → Service → Models → Entity

Serviceの処理などもテストの対象にしたい場合、Model層にDatabaseContextをDIできるのが理想的だと考えています。この場合、どのような方法をとるのがスマートでしょうか。

ControllerにDatabaseContextをDIして、Service → Modelsと引き渡すしかないでしょうか。


CC BY-SA 4.0
2021-07-15T08:14:57.440
78199
2021-08-16T07:45:55.860
8647
question
c# mvc asp.net-core
ASP.NET Core MVCでModel層にDIを行いたい


結論：普通にDIできる。

Service → Model → Repository
といった構成の場合は下記のようにDIの連鎖が作られていれば、ControllerにDIされる際に、下層にもDIが行われる。

**[Startup.cs]**

[code]

    // DIの登録
    services.AddTransient<IService, SampleService>();
    services.AddTransient<IModel, SampleModel>();
    services.AddTransient<IRepository, SampleRepository>();
    
[/code]

**[DIController.cs]**

[code]

    public class DIController : Controller
    {
        /// <summary>
        /// Controller InjectionでDIされるサービス
        /// </summary>
        private readonly IService service;
    
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public DIController(IService service)
        {
            this.service = service;
        }
    
        /// <summary>
        /// DIテスト
        /// </summary>
        [HttpGet]
        public IActionResult Index()
        {
            service.Doing();
            return RedirectToAction("Index", "Home");
        }
    }
    
[/code]

**[SampleService.cs]**

[code]

    public class SampleService : IService
    {
        private readonly IModel model;
    
        public SampleService(IModel model)
        {
            this.model = model;
        }
    
        public void Doing()
        {
            model.Store();
        }
    }
    
[/code]

**[SampleModel.cs]**

[code]

    public class SampleModel : IModel
    {
        private readonly IRepository repository;
    
        public SampleModel(IRepository repository)
        {
            this.repository = repository;
        }
    
        public void Store()
        {
            repository.Insert();
        }
    }
    
[/code]

**[SampleRepository.cs]**

[code]

    public class SampleRepository : IRepository
    {
        public void Insert()
        {
            Console.WriteLine("INSERT INTO DB");
        }
    }
    
    
[/code]


CC BY-SA 4.0
2021-08-16T07:45:55.860
80839
2021-08-16T07:45:55.860
8647
78199
answer