【问题标题】:"static" instance of a class for each instance of a custom control自定义控件的每个实例的类的“静态”实例
【发布时间】:2013-01-07 16:43:56
【问题描述】:

我有一个自定义控件。此自定义控件大量使用反射。在自定义控件程序集中,我有一个类,它是一个反射管理器。它处理控件中与反射相关的所有内容。它所做的一件事是为DataSource 中对象的每个属性缓存PropertyInfo 对象。我想将它设为static,这样我就可以在自定义控件类以及程序集中的其他支持类中轻松使用它。问题是这个控件在多个地方使用,并且具有不同的数据源,并且每个都有自己的PropertyInfo 对象集合。

创建此类的最佳方法是什么,以便它对控件的每个实例都有一个实例,并且也可用于自定义控件程序集中的其他类。

我想到的一件事是将我在自定义控件类中创建的反射管理器的实例插入到一个属性中/尽管支持类的构造函数(ala DI),但也许有一个更好的模式我'我只是不知道。

编辑:抱歉不清楚。该项目是一个 ASP.NET WebForms 项目。如果重要,控件是CompositeDataBoundControl

编辑 2: 我将详细说明我的设计以及我在其中看到的缺陷。 我有一个正在使用(或计划在多个页面中使用)的自定义控件类。 在这个控件里面我有这个类(对不起,如果我有一些语法错误,我是从内存中写出来的)。这不是整个课程,只是这里的相关内容。

public static class DataReflectionManager
{
    private static Dictionary<string, PropertyInfo> _propertyInfos = new Dictionary<string, PropertyInfo>();

    public static void RegisterDataSource(IEnumerable dataSource)
    {
        //Get the property info of each property of and
        //stick it in the dictionary.
    }

    public static string GetValueByPropertyKey(object o, string key)
    {
        //Takes o and gets the value of property key by the PropertyInfo object.
        return "";
    }
}

现在这个类不能保持静态,否则自定义控件的所有实例的字典将相同,并且它们每个都有自己的数据源,其中包含不同类型的对象。所以......静电已经出来了。但那又如何呢? 如果我只在自定义控件类中使用DataReflectionManager,我会在那里创建一个实例。问题是自定义控件使用的列类型,都继承自ColumnBase,而ColumnBase有一个abstract函数,在大部分继承的列类型中都使用了DataReflection管理器。所以我可以传递实例,但我正在寻找更智能的解决方案。

【问题讨论】:

  • 我需要例子来回答。
  • @SamIam - 抱歉不清楚。添加了缺失的信息。
  • 既然您显然在谈论拥有它的多个实例,那么将它作为一个静态类是没有意义的。它在概念上不是一成不变的,所以让它如此会与它的设计作斗争。您没有提供足够的信息让我们知道应该如何将类的各种实例暴露给它们需要暴露的对象,但这是您需要尝试解决的问题。
  • @Servy - 是的,如果我认为这个类需要是静态的,我不会一开始就问这个问题。谁将创建实例?如何?在哪里?以及如何传递它?是我需要帮助弄清楚的确切问题。

标签: c# asp.net oop design-patterns


【解决方案1】:

由于您不能拥有多个静态类实例,我将通过添加一个静态Dictionary&lt;&gt; 来解决这个问题,该控件类名称以包含反射管理器特定于控件的实例的控件类名称为键。

【讨论】:

  • 为什么是控件名称而不是控件类型?
  • @Rotem:对不起,我应该更具体一些;我的意思是控件类名,也就是控件类型。
  • @competent_tech - 感谢您的回答。该控件是单个类。它始终是同一类。您是在谈论实例(对象)的名称吗?因为我不能强制它是独一无二的。它用于许多页面。
  • @EladLachmi:对不起,我的意思是控件的类名(即 Type.ToString()),它在所有实例中都是唯一的。
  • @competent_tech - Type.ToString() 每个实例都是唯一的?你确定吗?
【解决方案2】:

我在这里找不到“完美”的解决方案,因为我能想到的每一种方法对于我们的特定设计都有一些缺点。

帮助我得出当前解决方案的想法是 ProperyInfo 对象列表与控件的特定实例相关联,因此用于存储它的 Dictionary&lt;string, PropertyInfo&gt; 也应该是控件的成员班级。这使我能够保持反射管理器静态并在支持类中进行最少的代码更改。

支持类在各自的构造函数中根据需要获取PropertyInfo 对象。

反射管理器通过控件构造函数中的反射创建字典,然后控件存储它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多