Я написал нестатический универсальный экземпляр класса для моего абстрактного дизайна Factory и использовал подход Singleton, чтобы убедиться, что только один экземпляр экземпляра будет инициализирован для каждого запроса клиента.Factory Initializer + Singleton
public sealed class FactoryInstantiator<T> where T: class
{
private static readonly FactoryInstantiator<T> _instance = new Instantiator<T>();
public static FactoryInstantiator<T> Instance
{
get
{
_client = HttpContext.Current.Session["ClientCode"].ToString();
return _instance;
}
}
private static string _client;
private string _className;
private string _fullyQualifiedClassName;
private string _assemblyName;
private FactoryInstantiator() { }
public T CreateInstance()
{
string fullClassName = typeof(T).ToString();
string[] splitClassName = fullClassName.Split('.');
_className = splitClassName[2];
_assemblyName = splitClassName[0] + "." + _client + "." + splitClassName[1];
_fullyQualifiedClassName = _assemblyName + "." + _className;
return (T)Activator.CreateInstance(Type.GetType(_fullyQualifiedClassName + "," + _assemblyName));
}
}
Я отведенный все пространство имен для каждого Клиента
namespace InventorySuite.Factory.BusinessLogic
{
// abstract factory
public abstract class InvoiceFactory
{
public abstract void Set() { }
}
}
namespace InventorySuite.Client1.BusinessLogic
{
// concrete invoice class for Client1
public class Invoice : InvoiceFactory
{
public override void Set() { }
}
}
namespace InventorySuite.Client2.BusinessLogic
{
// concrete invoice class for Client2
public class Invoice : InvoiceFactory
{
public override void Set() { }
}
}
protected void Page_Load(object sender, EventArgs e)
{
InvoiceFactory clientInvoice;
Session.Add("ClientCode", "Client1");
clientInvoice = FactoryInstantiator<InvoiceFactory>.Instance.CreateInstance();
clientInvoice.Set();
Session["ClientCode"] = "Client2";
clientInvoice = FactoryInstantiator<InvoiceFactory>.Instance.CreateInstance();
clientInvoice.Set();
}
Он хорошо работает и уже протестировал его, но мой вопрос о его эффективности/производительности попадании, так как я использую отражение здесь, и для подход Singleton, если он имеет проблемы с несколькими потоками (afaik, экземпляр singleton будет использоваться для всех клиентов). Я также буду признателен за любой другой подход. спасибо
Похоже на решение проблемы, для меня. – Mark
Положите блокировку вокруг линии, которая создает завод, и проверьте производительность, позвонив фабрике тысячи раз в цикле, измеряя и сравнивая время. –