ASP.net WEB API – 의존성 주입 서비스 등록 with Static 멤버변수

ㆍ의존성 주입 서비스등록 
   services.AddSingleton
<인터페이스, 구현클래스>();
    처음 요청 시, 생성되고 이 후 요청 시, 동일한 instance를 사용한다. 
   새로운 접속자가 접속해도 현재 만들어진 객체를 그대로 사용하게된다.(singleton 패턴 준수)
   (static 멤버변수와 같으며 , static 변수도 함께 살펴보자)

   아래, 간단하게 저장소를 구현해보자(저장소패턴) : 의존성주입은 인터페이스와 구현클래스를
   Generic T  parameter 로 받기때문에  반드시 구현해줘야한다.

Models 
<클래스정의>
class Mem

{
     public static Dept = “Officer”;

     public int No {get; set;}
     public string Name {get; set;}
     public int Age {get; set}
     public Mem(string name , int age) 
     {

           this.Name = name;
           this.Age = age;
     }
}

<인터페이스 정의>
public interface IMemberRepository
{
      public IEnumerable<Mem> members {get;}

      public Mem this[int Id] { get;}
      public Mem Add(Mem newMem);
      public Mem Update(Mem mem);
      public void Delete(int id);
}

<인터페이스 구현>
class MemberRepositoryIM : iMemberRepository
{
     public static DeptCode = “0001”;

      Dictionary<int ,Mem> _memberList;
     
      public IEnumerable<Mem> members { get {return this._memberList.values;} }

      public Mem this[int Id] { get { return this._memberList[id];} }

      public Mem Add(Mem newMem)  {      
             this._memberList.add(newMem);
      }

      public Mem Update(Mem mem)   {
            this.Add(mem);
      }

      public void Delete(int id) {
            this._memberList.remove.(id);
      } 

     public MemberRepositoryIM()
     {
           /*
              싱글톤 의존성 주입 서비스를 등록하면 services.AddSingleton<IMemberRepository, MemberRepositoryIM >(); 
              MemberRepositoryIM 클래스를 최초 접속자만 실행한다.

              MemberRepositoryIM  클래스가 호출될때(주입받을 생성자에서만가능)
              MemberRepositoryIM 클래스의 인스턴스를 생성해서 주입해줌
            */

            this._memberList.add(1 , new Mem(1 , “TEST1” , 18) ,    
            this._memberList.add(2 , new Mem(1 , “TEST2” , 21) ,    
            this._memberList.add(3 , new Mem(1 , “TEST3” , 16) , 
     }
}

 StartUp.cs 의존성 주입설정

public void ConfigureServices(IServiceCollection services)
{
            services.AddSingleton<IMemberRepository, MemberRepositoryIM >();
           // 최초 접속자만 호출되어 IMemberRepository 인스턴스가 생성되고,

           // 다른 모든 사용자들은(물리적으로 떨어진) 메모리에있는 instance 를 사용한다.
           // 1명이 변경한 _myMember 는 전체사용자가 사용하는 데이터에 영향을 미친다.               
           // 전역 static 멤버변수와 같은 성격을 가진다
           

            services.AddTransient<IMemberRepository, MemberRepositoryIM >();
            services.AddScoped<IMemberRepository, MemberRepositoryIM >();

            services.AddControllers();
}

Controller 

[Route(“api/[controller]”)]
[ApiController]
class MemberController : ControllerBase 
{       
        IMemberRepository  _myMember;

       /*
           MemberController 가 사용될때마다  생성자가 실행된다.
          참고로 MemberController 의 어느 메서드를 호출하든 반드시 생성자를 거치고 실행된다.
          의존성 주입은 클래스 생성자를 통해서만 주입 받아야 하며 , 아래와 같이 메서드로는 불가능함.

          [HttpGet(“/dataFill”)]
           public void dataFill(IMemberRepository members) {  }

       */
        public MemberController(IMemberRepository members) 
        {
               this._myMember = members;
        }

        [HttpPost(“/setValue/{name}/{code}“)]  // 파라미터의 변수명과  메서드의 변수명은 반드시 일치해야한다.
        public void setDepart(string name, string code)  
        { 
               /*
                      http://localhost/setValue/Sales/0099  – 호출

                      Mem 클래스와 MemberRepositoryIM 클래스의 Static 변수 변경
                      Mem 클래스의 static 멤버 Dept  부서를 기본 “officer” 에서   “sales” 로 변경 
                      MemberRepositoryIM 클래스의 DeptCode 부서코드를 “0099” 로 변경

                 ★ 현재 접속한 모든 사람과  이후 접속하는 ‘모든’ 사용자들의 Mem.Dept 와 MemberRepositoryIM.DeptCode 
                      가  Dept = “Sales” , DeptCode = “0099” 로 변경된다
                */
                 
                 Mem.Dept = name; 
                 MemberRepositoryIM.DeptCode = code;

        }       
}

 

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다