类的构造函数是否可以将代理包装在自身周围?遗憾的是,此代码导致StackOverflowException。
void Main()
{
var thing = new Thing();
}
public static readonly ProxyGenerator generator = new ProxyGenerator();
public class Thing
{
public Thing()
{
generator.CreateClassProxyWithTarget(this);
}
}
我想要一些方法来保证我的类的新实例被包装在代理中,而不是必须创建某种创建代理实例的工厂。
答案 0 :(得分:0)
据我所知,不支持你想要的东西。如果你有一个public,无参数构造函数,任何人都可以创建你的类。
现在,这并不意味着你无法得到你想要的东西 - 它只会是更多的工作。您可以在作为内部作用域的类上有一个“初始化”标志(只有程序集中的类可以访问它)。将使用工厂创建代理实例并将initialized标志设置为true。只有工厂才会设置此标志。您的类中的每个公共方法都可以执行检查以确保“initialized”标志为true并且如果其为false则抛出异常(这是“更多工作”的来源 - 您必须手动将此检查添加到每种方法)。由于它的范围,new'd up实例无法设置初始化标志。
这不会阻止某人修改你的某个课程,但至少会阻止他们使用它。至于序列化,你可能想要一些仅限数据的类并序列化那些而不是代理类。
答案 1 :(得分:0)
我最接近的是创建一个返回代理的Singleton。 这是一个例子:
public class MySingleton
{
protected static MySingleton _instance = null;
public static MySingleton Instance
{
get
{
if (_instance == null)
{
if (Simple.UseDynamicProxies)
_instance = Simple.GetProxy(typeof(MySingleton));
else
_instance = new MySingleton();
}
return _instance;
}
}
}
请注意,Simple类包含实际创建代理,拦截和日志记录等的“繁重工作”以及UseDynamicProxies标志,因此我可以在整个解决方案中打开/关闭代理使用。