gpt4 book ai didi

design-patterns - 如何动态实现代理模式?

转载 作者:行者123 更新时间:2023-12-04 07:02:16 25 4
gpt4 key购买 nike

我正在重温我去年写的类(class)跟踪(脏逻辑)。目前我有一个处理所有状态跟踪的 super 基类,但是我需要跟踪的每个属性的值都需要坚持标准 get { return _x; } 设置 { _isDirty = true; _x = 值; 工作方式。

在使用了 Entity Framework 并阅读了 Proxy Pattern 之后,我希望有更好的方法来实现我的 IsDIrty 逻辑,同时能够利用自动实现的属性?

老实说,我完全不知道自己在说什么。有没有办法可以执行以下操作:

public class Customer : ITrackable
{
[TrackState(true)] // My own attribute
public virtual string Name { get;set;}

[TrackState(true)]
public virtual int Age { get;set;}

// From ITrackable
public bool IsDirty { get; protected set; }

}

然后实现一个动态代理,它将使用反射(或其他神奇的解决方案)在使用 TrackState 属性设置属性值之前首先调用另一个方法。

显然,我可以通过创建物理代理类并使用 IoC 轻松地做到这一点:

public class CustomerProxy : Customer
{
Customer _customer;

public override string Name
{
get { return _customer.Name; }
set { IsDirty = true; return _customer.Name; }
}

// Other properties
}

但我不想为每个对象都这样做,否则我现有的解决方案没有任何好处。希望有人能满足我的好奇心,或者至少告诉我 EF 是如何实现的。

最佳答案

CaSTLe 的 DynamicProxy 正是这样做的:http://www.castleproject.org/dynamicproxy/index.html

允许您提供拦截器:

public void Intercept(IInvocation invocation)
{
// Call your other method first... then proceed
invocation.Proceed();
}

您可以通过 invocation.Method 访问 MethodInfo 对象。您可以通过设置 invocation.ReturnValue 来覆盖返回值。您可以访问(并覆盖)参数。

关于design-patterns - 如何动态实现代理模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3702512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com