C# 프록시 및 VAR 키워드
-
04-07-2019 - |
문제
이 질문은 이전 게시물과 관련이 있습니다. 여기. 기본적으로 나는 DAO를 엔티티에 주입하고 싶습니다.
public class User
{
IUserDAO userDAO;
public User()
{
userDAO = IoCContainer.Resolve<IUserDAO>;
}
public User(IUserDAO userDAO)
{
this.userDAO = userDAO;
}
//Wrapped DAO methods i.e
public User Save()
{
return userDAO.Save(this);
}
}
여기에 내 DAO에 사용자 정의 메소드가 있다면 기본적으로 엔티티 객체에 래핑해야합니다. 따라서 iuserdao.register ()가 있으면 use.register () 메소드를 작성하여 래핑해야합니다.
더 나은 것은 DAO의 메소드가 사용자 객체에 동적으로 할당되는 프록시 객체를 만드는 것입니다. 그래서 나는 다음과 같은 것처럼 보일 수 있습니다.
var User = DAOProxyService.Create(new User());
User.Save();
이것은 사용자 엔티티를 와이어를 통해 데이터 전송에 적합한 멍청한 클래스로 유지할 수 있지만 마술처럼 많은 DAO 방법을 제공한다는 것을 의미합니다.
그래도 이것은 내 모자 영역에서 벗어나고, 나는 이것을 달성하기 위해 무엇이 필요한지 궁금했습니다. Castles Dynamic Proxy를 사용할 수 있습니까? 또한 C# 컴파일러가 이에 대처하고 동적으로 추가 된 방법에 대해 알 수 있습니까?
이것이 넌센스인지 알려주십시오.
편집하다:
컴파일 타임에 사용자 객체를 반환하는 것으로 daoproxyservice.create ()를 어떻게 든 daoproxyservice.create를 선언해야합니다. 이것은 제네릭으로 수행 할 수 있습니다.
이것은 사실이 아닙니다. 반환하고 싶은 것은 사용자 객체가 아니라 동적으로 추가 된 userDAO 메소드가있는 사용자 객체입니다. 이 클래스는 어디에서나 방해받지 않기 때문에 컴파일러가 무엇을 만들어야할지 모릅니다.
내가 본질적으로 반환하는 것은 다음과 같은 새로운 객체입니다. 그러나 이것은 지저분 해 보인다.
내가 찾고있는 것이 이것과 비슷한 것 같습니다. 믹스 인
해결책
나는 처음에 당신이 물어 보는 것이 효과가 없다고 말할 것입니다. 그러나 약간의 조정으로 우리는 그것을 작동시킬 수 있습니다.
VAR은 단지 컴파일러 기능입니다. 당신이 말할 때.
var x = GetSomeValue();
컴파일러는 " 'getSomeValue'는 문자열을 반환하는 것으로 정의되어 있으므로 프로그래머는 'String x = getSomeValue ();'를 작성해야합니다. 주목하십시오 컴파일러 이것을 말합니다. 이 변경은 이루어집니다 엮다 시각.
본질적으로 객체를 반환하는 클래스 (daoproxyservice)를 정의하려고합니다. 이것은 작동하지만 "var 사용자"는 "객체 사용자"와 동일합니다.
컴파일 타임에 사용자 객체를 반환하는 것으로 daoproxyservice.create ()를 어떻게 든 daoproxyservice.create를 선언해야합니다. 이것은 제네릭으로 수행 할 수 있습니다.
class DAOProxyService
{
static DAOProxyService<T> Create<T>(T obj) { ......}
}
다른 팁
그렇지 않습니다 전적으로 자동이지만 데코레이터 클래스를 생성하기위한 Oleg Sych의 변형을 사용하는 것을 고려할 수 있습니다. iuserdao가 변경 될 때마다 (새 메소드 등) 파일을 재생합니다. 수동으로 유지하는 것보다 낫다 :-)
http://www.olegsych.com/2007/12/how-to-us-t4-t-generate-decorator-classes/