【发布时间】: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