В настоящее время я смотрю на оптимизацию среды приложения C # (.NET 3.5), и в настоящее время я смотрю на части кода, которые используют Activator.CreateInstance
для вызова методов сборки через интерфейсы.В качестве примера у меня есть следующий, полностью функциональный код:
private object InvokeAssembly(string assemblyPath, string assemblyType, string data)
{
Assembly assembly = Assembly.LoadFrom(assemblyPath);
Type type = assembly.GetType(assemblyType, true, true);
IMyInterface assemblyInterface = (IMyInterface)Activator.CreateInstance(type);
return assemblyInterface.DoSomething(data);
}
Вопрос в том, хороший ли это дизайн?Особенно если учесть, что этот конкретный метод вызывается сотнями раз в минуту, будет ли следующий шаблон singleton-esque
лучшим вариантом?
Улучшенный пример кода, предоставленный JaredPar
Dictionary<string, IMyInterface> assemblyCache = new Dictionary<string, IMyInterface>();
private object InvokeAssembly(string assemblyPath, string assemblyType, string data)
{
var cacheKey = assemblyPath + "*" + assemblyType;
IMyInterface assemblyInterface;
if (!this.assemblyCache.TryGetValue(cacheKey, out assemblyInterface))
{
Assembly assembly = Assembly.LoadFrom(assemblyPath);
Type type = assembly.GetType(assemblyType, true, true);
assemblyInterface = (IMyInterface)Activator.CreateInstance(type);
assemblyCache[cacheKey] = assemblyInterface;
}
return assemblyInterface.DoSomething(data);
}
Во втором примере интерфейс создается один раз и используется повторно, а не создается / собирается один раз за запрос.
Кажется логичным, что второй метод является лучшим решением, однако я более чем счастливСледует сказать, что это не имеет никакого значения.
Стоит также упомянуть, что этот метод и только этот метод работает на сборке