2025년 6월 15일 일요일

c# 싱글컨테이너

프로그램상 하나만 존재하는데 컨테이너에 넣어서 DI한다던가 할때 쓰는 아이


/// <summary>
/// 싱글톤 하나만 있는 클래스들을 모아놓은 컨테이너
/// </summary>
public class SingleContainer
{
     private SingleContainer() { }
     private static readonly Lazy<SingleContainer> _instance = new Lazy<SingleContainer>(() => new SingleContainer());
     public static SingleContainer Instance => _instance.Value;

     //내부 딕셔너리
     private readonly ConcurrentDictionary<Type, object> _objes = new ConcurrentDictionary<Type, object>();

     //등록
     public void Register<T>(T target_obj) where T : class
     {
         _objes[typeof(T)] = target_obj;
     }

     //Get (가져오기)
     public T GetObj<T>() where T : class
     {
         return _objes.TryGetValue(typeof(T), out var target_obj) ? target_obj as T : null;
     }

     //해당클래스가 들어있는지 여부
     public bool IsContains<T>() where T : class
     {
         return _objes.ContainsKey(typeof(T));
     }

     //해당클래스 삭제
     public void RemoveObj<T>() where T : class
     {
         _objes.TryRemove(typeof(T), out _);
     }
    
}

2025년 3월 4일 화요일

findstr 쓰기오류 해결방법

로그폴더안의 로그파일들에서 특정단어를 명령프롬프트로 찾을때

findstr 명령을 사용한다. 그런데 이때 그 로그파일들이 UTF-8등으로

findstr 사용할때 인코딩 문제 때문에 FINDSTR: 쓰기 오류 입니다.

라는 내용이 나오면서 더이상 진행이 안되는 경우가 있다.


이때는 명령창에서 문자표시 방식을 UTF-8로 바꾼후 findstr 명령을 수행하고

다시 949로 돌리면 됨


바꾸는 명령어 ->  chcp 65001

돌리는 명령어 -> chcp 949



음...  이거는 findstr 프로그램 내부에서 해결할수 있는 문제 같은데

해결을 안해주는것 같다.. 오류를 내지말고 현재인코딩으로 찾을수 없다고

표시를 해주면 될것 같은데 말이다.


2025년 3월 3일 월요일

라즈베리파이에 디지털 사이니지 입히기

라즈베리파이에 디지털 전광판 만들기..

뭐.. 음.. 그냥 파이썬 프로그램으로 미디어를 일정시간 돌게 만들수도 있지만

다른 사람이 해놓은 그럴듯한 프로그램이 있고 오픈소스라면 나보다 좀 더 

전문성이 있을 테니까.. 그걸 그냥 입히면 된다..  (뻘짓 금지 & 오류나면 귀찮음)

일단 라즈베리파이에다가 별도 이미지를 입히고 거기서 미디어의 노출옵션을

웹으로 제어하는 방식을 채택하는 시스템인것 같다.

이름은 Screenly  이다.

깃허브: https://github.com/Screenly/Anthias/releases


고고싱


참고: https://yjhtpi.tistory.com/193


2025년 2월 24일 월요일

c# 클래스 멤버 출력

c#으로 작업할때 VO클래스 멤버 필드와 프로퍼티를 출력 해야할일이 있다.

이때는 Reflection을 이용해서 출력하면 되는데 하나하나 하기 귀찮으면

MemberPrintAble 클래스를 만들어서 상속시키면 된다.


public abstract class MemberPrintAble
{
    public string MemberString()
    {
        FieldInfo[] fieldInfos = this.GetType().GetFields();
        PropertyInfo[] propertyInfos = this.GetType().GetProperties();
        //
        var sb = new StringBuilder();
        foreach (var ffo in fieldInfos)
        {
            var value = ffo.GetValue(this) ?? "(빈값)";
            sb.AppendLine(ffo.Name + ": " + value.ToString());
        }
        foreach (var info in propertyInfos)
        {
            var value = info.GetValue(this, null) ?? "(빈값)";
            sb.AppendLine(info.Name + ": " + value.ToString());
        }
        return sb.ToString();
    }
}



요로코롬 정의해놓고 MemberPrintAble클래스를 상속하고 

사용할때 MemberString 메서드를 호출하면

멤버필드와 프로퍼티값을 출력할수 있다.

ToString으로 override해서 언제하고 있뉘??



2025년 2월 10일 월요일

c# dynamic 변수에 배열 추가하기

C#에 dynamic 변수가 있는데 프로그램 실행중에 동적으로 타입이 결정된다..

일장일단이 있는데 보통 dynamic변수는 새롭게 구조체나 클래스를 만들기 번거롭거나

조건에 따라 응답을 달리해야하는 json result등을 만들때 많이 사용된다.


이 dynamic 변수에 배열을 넣는 방법은 먼저  IEnumable을 할수 있는 데이터를 
미리준비하고 그에따라 linq의 select 확장메서드 같은것 이용해서 만들면된다.

예를들어 교실이라는 클래스에 교실 정원, 교실 위치, 담당 선생님이름, 학생명부
로 되어있는 자료형이 있다고 했을때 이를 dynamic으로 변환할때 다른건 다좋은데
학생명부 student_list 같은것은 배열로 들어가 있어야할것인데 이처리를 하는 
방법은 다음과 같이


dynamic classRoom = new {
    StudentCount = 15,
    Location = "2F1B",
    TeacherName = "김선생",
    Students = student_list.Select(p => new { p.StudentNo, p.StudentName, p.Gender }).ToArray(),
};

요로코롬 구현하면 된다.  ㅇㅇ

2025년 1월 21일 화요일

asp.net으로 custom 인증처리 만들기

asp.net 으로 권한처리할때 (로그인말고 Authorization)
개별적인 인증이 필요할때가 있다.

기존 Auth처리말고 새로운 인증을 하고싶을때는 Custom 인증클래스를 만들어야하는데
예를 들어 HttpRequest 해더에 Authorization의 키에 
특정한 값내용이 들어가 있을때 이를 내부에서 별도로 
인증처리하여 실패하면 다음으로 못넘어 가게하고
Unauthorized를 리턴하게 하려면 다음과 같은 클래스를 만들면된다.




[AttributeUsage(AttributeTargets.Method)]
public class CheckCustomToken : Attribute, IAuthorizationFilter
{
     public CheckCustomToken() { }

     //
     public void OnAuthorization(AuthorizationFilterContext context)
     {
         //
         StringValues sv_authToken = "";
         context.HttpContext.Request.Headers.TryGetValue("Authorization", out sv_authToken);
         string str_authToken = sv_authToken.FirstOrDefault();

         // str_authToken 가지고 어쩌고 저쩌고
         bool bChk_auth = 췍췍(str_authToken);
         if (!bChk_auth)
         {
             context.Result = new UnauthorizedObjectResult("Invalid Token" );
             return;
         }
     }
}



이렇게 해서  컨트롤러의 메서드에서 다음처럼 Attribute로 달면된다.




[HttpPost]
[CheckCustomToken]
public async Task<IActionResult> gogosing()
{
    Ok();
}




요로코롬