Вопрос

Этот вопрос связан с моим предыдущим постом Здесь.По сути, я хочу внедрить 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, то я в основном должен был бы обернуть их в объект entity .Итак, если бы у меня был IUserDAO.Register() Тогда мне пришлось бы создать метод User.Register(), чтобы обернуть его.

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

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

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

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

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

Редактировать:

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

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

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

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

Это было полезно?

Решение

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

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

 var x = GetSomeValue();

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top