Прокси C# и ключевое слово var

Этот вопрос связан с моим предыдущим постом Здесь. По сути, я хочу внедрить DAO в сущность, т.е.

public class User
{
   IUserDAO userDAO;
   public User()
   {
         userDAO = IoCContainer.Resolve<IUserDAO>;
   }
  public User(IUserDAO userDAO)
   {
         this.userDAO = userDAO;
   }
   //Wrapped DAO methods i.e
   public User Save()
   {
       return userDAO.Save(this);
   }

}

Здесь, если бы у меня были собственные методы в моем DAO, мне в основном пришлось бы обернуть их в объект сущности. Итак, если бы у меня был IUserDAO.Register (), мне пришлось бы создать метод User.Register (), чтобы обернуть его.

Было бы лучше создать прокси-объект, в котором методы из DAO динамически назначаются объекту User. Так что у меня может получиться что-то вроде этого:

var User = DAOProxyService.Create(new User());
User.Save();

Это означало бы, что я могу сохранить сущность User как довольно тупой класс, подходящий для передачи данных по сети, но также волшебным образом наделить его кучей методов DAO.

Это очень сильно выходит за рамки моей зоны комфорта, и я задавался вопросом, что мне нужно для этого? Могу ли я использовать прокси Castles Dynamic? Также сможет ли компилятор C# справиться с этим и знать о динамически добавленных методах?

Не стесняйтесь, дайте мне знать, если это чушь.

Обновлено:

What we need to do it somehow declare DAOProxyService.Create() as returning a User object -- at compile time. This can be done with generics.

Это не совсем так, я хочу вернуть не объект User, а объект User с динамически добавленными методами UserDAO. Поскольку этот класс нигде не определен, компилятор не знает, что с ним делать.

По сути, я возвращаю новый объект, который выглядит примерно так: User: IUserDAO, так что я думаю, что могу выполнить приведение по мере необходимости. Но это кажется беспорядочным.

Похоже, то, что я ищу, похоже на это: Миксины

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
287
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я изначально собирался сказать, что то, о чем вы спрашиваете, не работает. Но с некоторыми настройками, возможно, мы сможем заставить его работать.

var - это просто функция компилятора. Когда ты сказал.

 var x = GetSomeValue();

компилятор говорит: «GetSomeValue определяется как возвращающая строку, поэтому программист должен иметь в виду написать строку x = GetSomeValue ();». Обратите внимание, что компилятор говорит об этом; это изменение выполняется во время компилировать.

Вы хотите определить класс (DAOProxyService), который по существу возвращает объект. Это будет работать, но «var User» будет таким же, как «Object user».

Нам нужно как-то объявить DAOProxyService.Create () как возвращающий объект User - во время компиляции. Это можно сделать с помощью дженериков:

class DAOProxyService
{
     static DAOProxyService<T> Create<T>(T obj) { ......} 
}

Это не полностью автоматически, но вы можете рассмотреть вариант использования метода Олега Сича для генерации классов декораторов. Всякий раз, когда IUserDAO изменяется (новый метод и т. д.), Просто регенерируйте файл. Лучше, чем поддерживать его вручную :-)

http://www.olegsych.com/2007/12/how-to-use-t4-to-generate-decorator-classes/

Я собираюсь немного поиграться с генерацией прокси, но я вернусь к этому. Все равно выглядит интересно.

Owen 23.10.2008 19:59

Другие вопросы по теме