温莎城堡 - C# 代理和 var 关键字
本文关键字:var 关键字 代理 城堡 | 更新日期: 2023-09-27 17:47:22
这个问题与我之前的一篇文章有关。基本上,我想将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 中的方法动态分配给用户对象。所以我可能有看起来像这样的东西:
var User = DAOProxyService.Create(new User());
User.Save();
这意味着我可以将 User 实体保留为一个非常愚蠢的类,适合通过网络传输数据,但也神奇地给它一堆 DAO 方法。
不过,这超出了我的舒适范围,我想知道我需要什么才能做到这一点?我可以使用城堡动态代理吗?此外,C# 编译器是否能够处理这个问题并了解动态添加的方法?
如果这是无稽之谈,请随时告诉我。
编辑:
我们需要做的是以某种方式将DAOProxyService.Create()声明为返回一个User对象 - 在编译时。这可以通过泛型来完成。
这并不完全正确,我想返回的不是用户对象,而是具有动态添加的 UserDAO 方法的用户对象。由于此类在任何地方都没有定义,编译器将不知道该怎么做。
我基本上返回的是一个看起来像:用户:IUserDAO,所以我想我可以根据需要进行投射。但这似乎很混乱。
看起来我正在寻找的内容类似于以下内容: 混合
我最初打算说你问的行不通。 但是通过一些调整,我们也许能够让它工作。
var 只是一个编译器功能。 当你说。
var x = GetSomeValue();
编译器说"'GetSomeValue'被定义为返回一个字符串,所以程序员必须写'string x = GetSomeValue();'"。 请注意,编译器是这样说的;此更改在编译时完成。
你想要定义一个类(DAOProxyService),它本质上返回一个对象。 这将起作用,但"var 用户"将与"对象用户"相同。
我们需要做的是以某种方式将DAOProxyService.Create()声明为返回一个User对象 - 在编译时。 这可以通过泛型来完成:
class DAOProxyService
{
static DAOProxyService<T> Create<T>(T obj) { ......}
}
它不是完全自动的,但你可以考虑使用 Oleg Sych 方法的变体来生成装饰器类。每当 IUserDAO 更改(新方法等)时,只需重新生成文件即可。比手动维护它更好:-)
http://www.olegsych.com/2007/12/how-to-use-t4-to-generate-decorator-classes/