1

この質問は、私の以前の投稿に関連しています。基本的に、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# コンパイラはこれに対処し、動的に追加されたメソッドについて知ることができますか?

これがナンセンスである場合は、遠慮なくお知らせください。

編集:

そのために必要なことは、コンパイル時に DAOProxyService.Create() を User オブジェクトを返すものとして何らかの形で宣言することです。これは、ジェネリックで行うことができます。

私が返したいのは User オブジェクトではなく、UserDAO メソッドが動的に追加された User オブジェクトです。このクラスはどこにも定義されていないため、コンパイラはそれをどうするかわかりません。

私が本質的に返しているのは、次のような新しいオブジェクトです: User : IUserDAO なので、必要に応じてキャストできると思います。しかし、これは面倒なようです。

私が探しているのはこれに似ているようです: Mixins

4

2 に答える 2

0

完全に自動化されているわけではありませんが、Oleg Sych の方法のバリエーションを使用してデコレーター クラスを生成することを検討してください。IUserDAO が変更されるたびに (新しいメソッドなど)、ファイルが再生成されます。手動で維持するよりも優れています:-)

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

于 2008-10-23T15:25:18.717 に答える
0

私は当初、あなたが求めるものはうまくいかないと言うつもりでした。しかし、少し調整すれば、それを機能させることができるかもしれません。

var は単なるコンパイラ機能です。あなたが言う時。

 var x = GetSomeValue();

コンパイラーは、「'GetSomeValue' は文字列を返すものとして定義されているため、プログラマーは 'string x = GetSomeValue();' と記述する必要がある」と述べています。コンパイラがこれを言うことに注意してください。この変更はコンパイル時に行われます。

基本的にオブジェクトを返すクラス (DAOProxyService) を定義したいと考えています。これは機能しますが、「var User」は「Object user」と同じになります。

そのために必要なことは、コンパイル時に DAOProxyService.Create() を User オブジェクトを返すものとして何らかの形で宣言することです。これはジェネリックで行うことができます:

class DAOProxyService
{
     static DAOProxyService<T> Create<T>(T obj) { ......} 
}
于 2008-10-23T14:41:12.363 に答える