Этот вопрос связан с моим предыдущим постом Здесь. По сути, я хочу внедрить 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, так что я думаю, что могу выполнить приведение по мере необходимости. Но это кажется беспорядочным.
Похоже, то, что я ищу, похоже на это: Миксины





Я изначально собирался сказать, что то, о чем вы спрашиваете, не работает. Но с некоторыми настройками, возможно, мы сможем заставить его работать.
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/
Я собираюсь немного поиграться с генерацией прокси, но я вернусь к этому. Все равно выглядит интересно.