Първо, малко предистория на моя въпрос; Пиша модулна програма тип сървър/клиент на C#. Имам система за обработка с нишки, за да обработвам моите пакети от клиентска опашка, пример за това, с което работя:
public delegate object ProcessPacket(object data);
public class QueueHandler
{
//Awesome functions/variables
private void Proccess()
{
object retPacket = client.ProcessPacket(obj);
NetworkCommon.Sendpacket(retPacket, _clientSocket);
}
//Even more awesome functions.
}
//Client ProcessPacket delegate
private static object ProcessPacket(object packet)
{
ReturnPacket ret = new ReturnPacket();
switch (packet.Command)
{
case Command.Login:
//Do login stuff
break;
case Command.Foo;
//Foo stuff
break;
case Command.Bar;
//Bar stuff
break;
default:
ret.Responce = CommandResponce.CommandNotRecognized;
}
return ret;
}
Както можете да се досетите, това не е много разширимо и ще бъде трудно да се управлява с добавяне на функции. Въпросът ми е Кой е по-практичен начин за това?
Мислех за нещо като List<string,TProcessCommand>
, присвояване на персонализиран атрибут на функцията, след което изграждане на този списък при стартиране с помощта на отражение. Но смятате, че все още може да е тромаво за управление и евентуално ненужна процесорна мощност при всяко стартиране.
Друг вариант, който обмислях, е използването на MEF, но ми е трудно да си обясня как да идентифицирам между командите, без да използвам Linq, с който не съм запознат.
[[РЕДАКТИРАНЕ]] Току-що забелязах в MEF
пример, ExportMetadataAttribute
е използван. Ще опитам това с моя код.
swtich
в по-разширяем код е много често срещан въпрос - потърсете го (т.е. на SO - stackoverflow.com/ search?q=%5Bc%23%5Dswitch+refactoring), за да видите още алтернативи. Наследяване и речник на съпоставянето на команда към действие са често срещани опции. - person Alexei Levenkov   schedule 24.05.2013