C#プロキシとvarキーワード
-
04-07-2019 - |
質問
この質問は、以前の私の投稿ここ。基本的に、エンティティに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メソッドも提供します。
これは私のコンフォートゾーンからはかなり外れていますが、これを達成するために何が必要かと思いましたか? Castles Dynamicプロキシを使用できますか?また、C#コンパイラはこれに対処し、動的に追加されたメソッドについて知ることができますか?
これがナンセンスかどうかをお気軽にお知らせください。
編集:
それを行うために必要なことは、コンパイル時にDAOProxyService.Create()をUserオブジェクトを返すものとして何らかの形で宣言します。これはジェネリックで行うことができます。
これはまったく真実ではありません。私が返したいのは、Userオブジェクトではなく、UserDAOメソッドが動的に追加されたUserオブジェクトです。このクラスはどこでも定義されていないため、コンパイラは何を作成すればよいかわかりません。
基本的に返すのは、User:IUserDAOのような新しいオブジェクトです。したがって、必要に応じてキャストできると思います。しかし、これは面倒です。
探しているものは次のように見えます:ミックス
解決
最初は、あなたが尋ねたものが機能しないと言いました。しかし、少し調整することで、動作させることができるかもしれません。
varは単なるコンパイラ機能です。あなたが言うとき。
var x = GetSomeValue();
コンパイラは、「GetSomeValue」は文字列を返すと定義されているため、プログラマーは「string x = GetSomeValue();」&quot;と記述する必要があります。 コンパイラがこれを言っていることに注意してください。この変更は、コンパイル時に行われます。
基本的にオブジェクトを返すクラス(DAOProxyService)を定義します。これは機能しますが、「var User」 &quot; Object user&quot;と同じになります。
これを行うために必要なことは、コンパイル時に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/