Статический конструктор для класса SourceManager
проходит через все модули/классы и обнаруживает все классы, реализующие ISource
. Он будет создавать экземпляр каждого из них и выставить IEnumerable
из них как статическое свойство, называемое IEnumerable<ISource> Sources
. Для простоты ISource
имеет два свойства: DataTable Table { get; }
и string UniqueName { get; }
. Когда экземпляр каждого другого ISource
отвечает за заполнение его Table
из SQL, MDX и т.д. Для всех ISource
, которые я написал до сих пор, загрузка Table
со всеми DataRow
при создании экземпляра была достаточной, Однако У меня теперь есть ситуация, когда я хотел бы загружать Table
с DataRow
лениво, а не все спереди. Как это сделать? Я пройду через пример.
PermissionSource
реализует ISource
. Свойству Table
, имеющему a private set
, присваивается значение new PermissionDataTable()
. Его UniqueName
составляет "Permissions"
. На данный момент в базу данных не входят никакие разрешения, загруженные из базы данных.
ISource permissionSource = SourceManager.Sources.
Where(s => "Permission".Equals(s.UniqueName)).First();
Теперь мы получили PermissionSource
, но через интерфейс. Позвольте получить разрешение.
DataRow row = permissionSource.Table.Rows.Cast<DataRow>().
Where(r => r["PermissionName"].Equals("PermissionName")).First()
Я переопределил свойство Rows
в PermissionDataTable
, чтобы вышесказанное каким-то образом получило значение разрешений, связанных с "PermissionName"
в базе данных. Другие разрешения не загружаются.
У меня нет выбора в системе разрешений, и у меня нет выбора, чтобы не использовать DataTable
.
EDIT:
В моем примере мне нужно переопределить свойство Rows
DataTable
. Rows
, однако, DataRowCollection, который sealed
. Таким образом, не так много можно сделать с точки зрения создания минимальной пользовательской реализации DataTable, как я хочу.