Frage

Diese Frage zu einem frühen Post von mir Zusammenhang hier . Grundsätzlich möchte ich eine DAO in einer Einheit injizieren, das heißt

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);
   }

}

Hier, wenn ich eine benutzerdefinierte Methoden in meinem DAO hatte dann muss ich sie im Grunde in der Entitätsobjekt wickeln. Also, wenn ich ein IUserDAO.Register () hätte, würde ich dann eine User.Register () -Methode erstellen müssen, um es zu wickeln.

Was wäre besser, ist ein Proxy-Objekt zu erstellen, wo die Methoden aus dem DAO dynamisch auf das Benutzerobjekt zuordnen. So kann ich etwas, das wie folgt aussieht:

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

Dies würde bedeuten, dass ich für die Datenübertragung geeignet über den Draht die Benutzereinheit als ziemlich dumm Klasse halten kann, sondern auch auf magische Weise eine Reihe von DAO Methoden geben.

Diese

ist sehr viel aus meiner Komfort-Zone aber, und ich fragte mich, was ich brauchen würde dies zu erreichen? Kann ich Schlösser Dynamische Proxy verwenden? Auch würde die C # Compiler in der Lage sein, dies zu bewältigen und weiß um die dynamisch hinzugefügt Methoden?

Fühlen Sie sich frei, mich zu informieren, wenn dieser Unsinn ist.

EDIT:

  

Was wir es irgendwie tun müssen, erklären DAOProxyService.Create () als ein User-Objekt zurückkehrt - bei der Kompilierung. Dies kann mit Generika erfolgen.

Das ist nicht ganz richtig, was ich zurückkehren will, ist kein Benutzerobjekt, sondern ein Benutzerobjekt mit dynamisch hinzugefügt UserDAO Methoden. Da diese Klasse nicht überall defnied ist, wird der Compiler weiß nicht, was daraus zu machen.

Was ich im Wesentlichen zurückkehre ist ein neues Objekt, das wie folgt aussieht: Benutzer: IUserDAO, so dass ich glaube, ich könnte je nach Bedarf gegossen. Aber das scheint chaotisch.

Sieht aus wie das, was ich suche ist ähnlich wie diese: Mixins

War es hilfreich?

Lösung

Ich wollte zunächst sagen, was Sie nicht arbeiten fragen. Aber mit einigen Optimierungen, könnten wir in der Lage sein, es zu bekommen zu arbeiten.

var ist nur ein Compiler-Funktion. Wenn Sie sagen.

 var x = GetSomeValue();

Der Compiler sagt " 'GetSomeValue' ist definiert als eine Zeichenfolge zurückkehrt, so dass der Programmierer muss gemeint von 'string x = GetSomeValue ();' zu schreiben". Beachten Sie, dass die Compiler sagt dies; Diese Änderung erfolgt in Compile Zeit.

Sie möchten eine Klasse (DAOProxyService) definieren, die im wesentlichen ein Objekt zurückgibt. Dies funktioniert, aber "var User" würde das gleiche wie "Object Benutzer" sein.

Was wir es irgendwie tun müssen, erklären DAOProxyService.Create () als ein User-Objekt zurückkehrt - bei der Kompilierung. Dies kann mit Generika erfolgen:

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

Andere Tipps

Es ist nicht ganz automatisch, aber Sie könnten eine Variation von Oleg Sych Methode zur Erzeugung von Dekorateur Klassen in Betracht ziehen. Jedes Mal, wenn IUserDAO ändert (neue Methode, etc) regeneriert einfach die Datei. Besser als die Aufrechterhaltung es manuell: -)

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top