그래서이 문제가 있으며 아무도 도울 수없는 것 같습니다. 따라서 멀리 떨어져 버리기보다는이 특정 고양이를 피부에 대하는 다른 방법을 위해 그것을 버릴 것입니다.AOP 차단 속성
나는 현재 다음과 같습니다
public interface ICustomerService
{
Customer GetCustomer(int id);
}
public class CustomerService : ICustomerService
{
public Customer GetCustomer(int id)
{
...
}
}
... 그리고 유니티와 나는 IOC 설정을 가지고 있고, 같은 동시에 차단을 구성 :
IUnityContainer ioc = new UnityContainer();
ioc.RegisterType<ICustomerService, CustomerService>()
.Configure<Interception>()
.SetInterceptorFor<ICustomerService>(new InterfaceInterceptor());
무엇 내가 실현하려 할 것은 다음과 같이 인터페이스에 속성을 배치 할 수 있습니다.
public interface ICustomerService
{
[Log]
Customer GetCustomer(int id);
}
... 다음과 같이 정의됩니다.
public class LogAttribute: HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new LogHandler();
}
}
... 다음 LogHandler 클래스에서 내가 좋아 원하는 모든 로깅을 수행
public class LogHandler : ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
... log stuff
}
}
무엇 내가 달성하고자하는 것은 추적/로깅 시스템 핸들러 로그가 무엇 네임 스페이스입니다. class.methodname이 호출되고,이를 호출 한 부모 namespace.class.methodname이 호출됩니다. 나는 "입력"IMethodInvocation 매개 변수를 사용하여 원하는 정보를 얻으려고 시도했지만, 문제는 입력이 "ICustomerService"인터페이스를 반환하는 반면 상위 스택 프레임을 검사하면 부모의 구현 된 클래스를 반환합니다 (예 : . CustomerService) 엔티티 ID로 namespace.class.methodname을 사용하여 트리 구조를 만들려고 할 때 ID와 parentID가 일치하지 않는다는 것을 의미합니다.
[Log] 속성에 매개 변수를 놓는 것은 실제로 거기에 넣을 수 있기 때문에 실제로 작동하지 않습니다. 만약 내가 인터페이스 이름을 넣어, 난 여전히 하나의 ID가 인터페이스이며 부모가 구현 클래스입니다 위의 동일한 문제가 있습니다. 그리고, 나는 인터페이스의 속성에 구현 클래스 이름을 넣을 수 없기 때문에 처음에는 인터페이스를 갖는 목적을 상실했습니다!
그래서, 그것은 딜레마입니다. 누구나 신선한 아이디어를 얻었습니까?
그래 내가 PostSharp 알고 있어요,하지만 난 문제를 복잡하게 시작하기 전에 더 많은 dll 레퍼런스와 툴을 가지고 있으면 PostSharp가 그만한 가치가있다. 더 중요한 것은 Unity와 Entlib만으로 원하는 것이 무엇인가? – krisg
Unity와 Entlib만으로 가능한지 모르겠습니다. PostSharp는 이것을 달성하는 데 매우 간단하다는 것을 알았고, 컴파일 타임 IL 수정이므로 PostSharp 어셈블리를 배포 할 필요가 없습니다. – user207462