Iam пытается использовать AppDomains, чтобы изолировать и запустить код в моем приложении. Что мне нужно сделать, это создать новый AppDomain для каждого клиента и под этим AppDomain, мне нужно создать экземпляр другого класса, который содержит код, который необходимо изолировать. Мне также нужно каким-то образом сохранить этот созданный экземпляр, чтобы я мог получить к нему доступ позже, когда тот же клиент, который создал его, снова вызывает. Путь Im создавая сейчас это:Хранение экземпляра объекта, созданного под AppDomain
private Dictionary<string, IsolatedClass> isolatedClassesList = new Dictionary<string, IsolatedClass>();
public void Initialize(string clientId)
{
AppDomain appDomain = AppDomain.CreateDomain("New AppDomain");
IsolatedClass isolatedClass = (IsolatedClass)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(IsolatedClass).FullName);
isolatedClass.Initialize(clientId);
isolatedClassesList.Add(clientId, isolatedClass);
}
Создание AppDomain и первый вызов «Initiliaze(clientId)
» метод отлично работает. Также хранение его в словаре (для последующего использования) выполняется без каких-либо исключений.
Проблема возникает, когда я пытаюсь получить экземпляр ранее созданного IsolatedClass
позже, как это:
public void DoSomething (string clientId)
{
IsolatedClass isolatedClass = isolatedClassesList.First(x => x.Key == clientId).Value;
isolatedClass.RunIsolatedMethod();
}
Он бросает исключение нулевой референс (он не может получить экземпляр). Когда я помещаю точку останова и проверяю, что находится внутри словаря, для Value
, это показывает мне, что: «Получение этого типа прозрачного прокси не поддерживается в этом контексте».
Это полностью неправильный подход или есть какая-то незначительная ошибка? Если мой подход совершенно не прав, есть ли другой способ, как достичь моей цели?
EDIT
Видимо, был какой-то вопрос с самим IsolatedClass
- это был унаследовать от другого класса, который наследует от MarshallByRefObject. Когда я создал простой класс манекена и работал с инструкцией от Kentonbmax, он сработал. Я продолжу тестирование, чтобы увидеть, какова была настоящая проблема.
Посмотрите на System.Runtime.Caching.MemoryCache. Вы можете поместить свой построенный объект в кеш, используя ключ кеша, который идентифицирует как домен приложения/клиентский запрос, так и объект. – StingyJack