문제

다른 질문에서 이 내용을 놓쳤다면 사과드립니다.나는 독특한 질문이 있다고 결정하기 전에 오랫동안 찾았습니다 ...DynamicProxy2를 사용하여 WPF 애플리케이션의 모델 클래스에 대한 차단을 제공하고 싶습니다.이는 INotifyPropertyChanged를 모든 곳에서 완전히 구현할 필요가 없도록 하기 위한 것입니다.예를 들어, 아래 클래스는 프록시되고 차단된 후 양방향 데이터 바인딩에 완전히 참여해야 합니다.

public class ModelExample : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public int Id{ get; set; }
    public string Uri{ get; set; }
    public string Name{ get; set; }
}

모델 클래스의 새 인스턴스를 생성하고 CreateClassProxy 메서드를 호출하여 해당 인스턴스에 대한 호출을 가로챌 수 있음을 발견했습니다.

new ProxyGenerator().CreateClassProxy<T>(interceptors);

불행하게도 이로 인해 나는 ProxyGenerator 클래스를 사용하여 모델 인스턴스를 생성하고 이를 중간 계층에서 다시 가져옵니다.그들은 이미 존재합니다.기존 개체를 래핑해야 하므로 생각하다 전화해야 해 CreateClassProxyWithTarget 대신에:

new ProxyGenerator().CreateClassProxyWithTarget(instance, interceptors);

그러나 그렇게 하면 인터셉터가 작동을 멈춥니다.인터셉터의 잘못이 아니라고 확신합니다...그것은 매우 간단한 개체입니다.인터페이스는 다음과 같습니다.

public interface IFluentInterceptor : IInterceptor
{
    IFluentInterceptor Before(Action<IInvocation> before);
    IFluentInterceptor After(Action<IInvocation> after);
    IFluentInterceptor Finally(Action<IInvocation> @finally);
    IFluentInterceptor RunCondition(Func<IInvocation, bool> runCondition);
    IFluentInterceptor OnError(Func<IInvocation, Exception, bool> onError);
}

그만큼 FluentInterceptor type이 이것을 구현합니다.그만큼 Before, After, 등.방법은 너무 간단해서 보여드릴 수 없습니다.그들은 모두 메서드 호출 중에 사용되도록 의도된 작업 대기열에 추가된 다음 각 메서드가 반환됩니다. this, 메소드 체인을 허용합니다.

아래 코드는 작동하지 않지만 이유를 알 수 없습니다.

new ProxyGenerator().CreateClassProxyWithTarget(instance, new FluentInterceptor()
    .After(invocation =>
    {
        if (!invocation.Method.Name.StartsWith("set_")) return;
        string propertyName = invocation.Method.Name.Substring(4);
        FieldInfo info = invocation.TargetType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
            .Where(f => f.FieldType.Equals(typeof (PropertyChangedEventHandler)))
            .FirstOrDefault();
        if (info == null) return;
        var handler = info.GetValue(invocation.InvocationTarget) as PropertyChangedEventHandler;
        if (handler != null) handler.Invoke(invocation.TargetType, new PropertyChangedEventArgs(propertyName));
    }));

내가 그걸로 시도하면 CreateClassProxy, 그것은 매력처럼 작동합니다.내가 뭘 잘못하고 있는지 아는 사람 있나요?

감사해요!

도움이 되었습니까?

해결책

솔직히, 나는 이것이 비 문제라고 생각한다.나를 위해 INotifyPropertyChanged 구현을 생성하기 위해 컨테이너가 필요하면 컨테이너에 의해 구축 된 모델 오브젝트를 꽂아야하는 프린지 케이스에있을 것입니다....에다른 모든 경우에서는 정확한 논리를 주변의 정확한 논리가 사례별로 결정되는 MVVM ViewModels를 사용하고 있으며 사용자 경험이 초점을 맞추고 있습니다.모델 클래스는 일반적으로 어떤 식 으로든 평평하게하거나 변형되므로 모든 포인트는 멍청합니다.나는이 질문을 한 번 에이 질문을 한 번에 내가 앱에서 MVVM을 적절하게 활용하는 방법을 이해하지 못했고, 나는 더 많은 움직이는 부분에 대해 책임을지지 않을 것이라고 생각했습니다.내 뷰 모드를 제대로 구성하기 시작하면 실제로 훨씬 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top