ㆍ의존성 주입 서비스등록 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 클래스를 최초 접속자만 실행한다.
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 멤버변수와 같은 성격을 가진다
[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” 로 변경된다 */