247. Implementing a fluent syntax part 1

בהמשך לפעם הקודמת,

נניח ואנחנו רוצים לממש Fluent Syntax משלנו.

השלב הראשון הוא ליצור איזשהו סט ממשקים שמייצג את הפעולות שלנו.

לצורך העניין ניצור ממשק המייצג פעולות על DataTable:

איזה פעולות יש על DataTable? נניח שנסתפק בהוספת עמודות והגדרתן:

1
2
3
4
public interface ITableDefinitionSyntax
{
ITableOrColumnDefinitionSyntax<T> WithColumn<T>(string name);
}

כעת מהו ITableOrColumnDefinitionSyntax? זהו ממשק המייצג מה אנחנו יכולים לעשות על טבלה או על Column שלה.

איזה פעולות נשים בו? נשים למשל פעולה של להפוך לPrimaryKey, ופעולה של קביעת ערך דיפולטי:

1
2
3
4
5
public interface ITableOrColumnDefinitionSyntax<T> : ITableDefinitionSyntax
{
ITableOrColumnDefinitionSyntax<T> MakePrimaryKey();
ITableOrColumnDefinitionSyntax<T> WithDefaultValue(T value);
}

ניצור מימושים פשוטים:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
internal class TableDefinitionSyntax : ITableDefinitionSyntax
{
protected readonly DataTable mTable;
public TableDefinitionSyntax(DataTable table)
{
mTable = table;
}
public ITableOrColumnDefinitionSyntax<T> WithColumn<T>(string name)
{
DataColumn column = mTable.Columns.Add(name,typeof(T));
return new TableOrColumnDefinitionSyntax<T>(mTable, column);
}
}

ולITableOrColumnDefinitionSyntax:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
internal class TableOrColumnDefinitionSyntax<T> : TableDefinitionSyntax, ITableOrColumnDefinitionSyntax<T>
{
private readonly DataColumn mColumn;
public TableOrColumnDefinitionSyntax(DataTable table, DataColumn column) : base(table)
{
mColumn = column;
}
public ITableOrColumnDefinitionSyntax<T> MakePrimaryKey()
{
mTable.PrimaryKey = newDataColumn[]{mColumn};
return this;
}
public ITableOrColumnDefinitionSyntax<T> WithDefaultValue(T value)
{
mColumn.DefaultValue = value;
return this;
}
}

מה שהפעולות שלנו עושות זה בסה"כ מממשות את הפונקציות של הממשק, ומחזירות Syntax המשך מתאים.

מה אפשר לעשות עם מה שעשיתי עד כה? אפשר ליצור Extension Method לDataSet שיתן לנו Syntax קצת Fluentי:

1
2
3
4
5
public static ITableDefinitionSyntax AddTable(this DataSet dataSet,string name)
{
DataTable added = dataSet.Tables.Add(name);
return new TableDefinitionSyntax(added);
}

ואז נוכל להגדיר חלק מהטבלה כמו שראינו פעם קודמת:

1
2
3
4
5
6
dataSet.
AddTable("DEPARTMENT").
WithColumn<int>("PK").
MakePrimaryKey().
WithColumn<string>("NAME").
WithDefaultValue("John Doe");

ממש קסם 😃

המשך יום צף טוב!

שתף