Я пишу библиотеку, и возник вопрос о stati c классах и stati c полях / реквизитах. что я делаю:
static class PacketFactory
{
private static readonly Dictionary<int, Type> RadiusPacketTypes;
static PacketFactory()
{
RadiusPacketTypes = new Dictionary<int, Type>() {
{1,typeof(AuthPacket)},
{2,typeof(AuthPacket)},
{3,typeof(AuthPacket)},
{4,typeof(AccPacket)},
{5,typeof(AccPacket)},
{11,typeof(AuthPacket)},
};
}
/// <summary>
/// Returns an instance of the PacketBuilder class, that can be used to build a IRadiusPacket object
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
/// <exception cref="InvalidCodeException"></exception>
public static PacketBuilder GetInstance(byte code)
{
var valueFound = RadiusPacketTypes.TryGetValue(code, out var type);
if (!valueFound) {
throw new InvalidCodeException();
}
var instance = (IRadiusPacket)Activator.CreateInstance(type);
instance.Code = (Enums.PacketCode)code;
var packetBuilder = new PacketBuilder(instance);
return packetBuilder;
}
}
Во-первых, считается ли поле stati c плохим дизайном? Во-вторых, в основном я создал фабрику, которая возвращает IRadiusPacket, конкретная реализация c, которая возвращается, зависит от кода. Я использовал словарь для этого, имеет ли это смысл? Что было бы лучшим способом решить это? Каков еще один хороший способ избежать операторов переключения, который имеет смысл в этой ситуации.
Кстати, предложения и критика всегда приветствуются!