城堡的自代理构造函数?

时间:2012-08-09 02:35:09

标签: castle castle-dynamicproxy dynamic-proxy

类的构造函数是否可以将代理包装在自身周围?遗憾的是,此代码导致StackOverflowException。

void Main()
{
    var thing = new Thing();
}

public static readonly ProxyGenerator generator = new ProxyGenerator();

public class Thing
{
    public Thing()
    {
        generator.CreateClassProxyWithTarget(this);
    }
}

我想要一些方法来保证我的类的新实例被包装在代理中,而不是必须创建某种创建代理实例的工厂。

2 个答案:

答案 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标志,因此我可以在整个解决方案中打开/关闭代理使用。