#c_sharp
Есть следующие типы в пространстве имен: namespace Model { public interface IData { void Send(string str); } public class Test { public void Run() { // (1) } } } В методе Test.Run для его работы должна оказаться ссылка на объект с реализацией IData. Есть следующая реализация интерфейса IData и код для работы с Test. class Data : Model.IData { public void Send(string str) { } } var d = new Data(); var t = new Test(); // (2) Какой код должен быть вместо (1) и (2), чтобы в Test.Run оказалась ссылка на Data? При этом в определении класса Test нельзя что-либо менять, нельзя добавлять конструктор(ы), методы, свойства и поля, и нельзя менять сигнатуру метода Run. Также нельзя использовать Singleton. p.s. Это не для "размять мозги", как сказали в комментах. Есть огромное количество кода. И есть просто драконовский анализатор кода. Добавлять/менять правила в анализаторе не будут. Код Model менять нельзя и синглтоны исключены, а в Test.Run надо добавить зависимость. На вопрос, - как? Ответили, - как хотите так и делайте. Если есть идеи - напишите как, а не минусуйте вопрос.
Ответы
Ответ 1
Вот рабочий пример с thread local storage: namespace Model { public interface IData { void Send(string str); } public class Test { public void Run() { LocalDataStoreSlot slot = Thread.GetNamedDataSlot("dict"); var dict = (Dictionary)Thread.GetData(slot); var d = dict[this]; } } } namespace ThreadLocalTest { class Data : Model.IData { public void Send(string str) { } } class Program { static void Main(string[] args) { var d = new Data(); var t = new Model.Test(); LocalDataStoreSlot slot = Thread.AllocateNamedDataSlot("dict"); var dict = new Dictionary (); Thread.SetData(slot, dict); dict[t] = d; t.Run(); Thread.FreeNamedDataSlot("dict"); } } } По поводу других возможных опций, вот ещё: http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html (это пригодится, если вы хотите протащить контекст через границу await). Ответ 2
В порядке дурацкого предложения. Создаём новый класс, который слушает сетевой порт. В конструктор передаём адрес объекта типа Data. В Test.Run подключаемся к порту и получаем адрес. Можно также использовать вместо сетевых соединений pipe или класть адрес в файл с фиксированным расположением.
Комментариев нет:
Отправить комментарий