2011-08-31 13 views
8

Questo dovrebbe essere semplice, ma non riesco a trovare nulla là fuori.Genera automaticamente una classe wrapper in C# utilizzando Composizione

Ho una classe in un unico assembly (una libreria condivisa - è un insieme di classi proxy per un servizio Web) Ho una classe in un altro assembly (progetto web)

c'è una classe denominata " Profilo "che si trova nell'assembly Proxy. Esiste un insieme di classi che "usano" un profilo nel progetto web. Quando non ci sono utenti loggati, viene utilizzato un GenericProfile.

Seguendo il principio di "separazione delle preoccupazioni" .... L'assembly Proxy viene utilizzato da altri progetti e riguarda solo i servizi Web. Il progetto web contiene solo elementi web

Tuttavia, ora c'è questa necessità di un "GenericProfile" - pensarlo come "Utente ospite".

La cosa logica da fare è creare un'interfaccia chiamata IProfile e far sì che entrambe le classi ne derivino. Ma ciò creerebbe una dipendenza circolare tra i due assiemi.

L'idea migliore è quella di creare un terzo assembly chiamato MyInterfaces e inserire l'IProfile lì, ma ciò causa una violazione del principio Separation of Concerns a mio parere. Per lo meno, un'istanza di questo problema sembra una ragione troppo piccola per scaturire dalla creazione di un modulo aggiuntivo nella mia soluzione.

Inserire la classe wrapper - o la classe wrapper Composite (qualunque cosa si voglia chiamare)

Sto cercando qualcosa che finisce per generare qualcosa di simile qui di seguito. C'è uno strumento o un'estensione di Visual Studio che lo farà? Forse un file .tt?

namespace WebProject 
{ 
    public interface IProfile 
    {...} 

    class MyWrapperClass : IProfile 
    { 
     Proxy.Profile _profile; 

     public MyWrapperClass(Proxy.Profile proxy) 
     { 
      _profile = proxy; 
     } 

     public string IProfile.Property1{ get { return _profile.Property1; } set { _profile.Property1 = value; } } 
     public string IProfile.Property2{ get { return _profile.Property2; } set { _profile.Property2 = value; } } 
     public string IProfile.Property3{ get { return _profile.Property3; } set { _profile.Property3 = value; } } 
    } 

} 
+1

E sembra che qualcuno abbia chiesto qualcosa di simile a questo ... http://stackoverflow.com/ques tions/2150416/generazione-pass-through-code-when-preferring-composition-over-inheritance – 010110110101

+0

Non ho ReSharper però ... – 010110110101

+1

Vorrei usare T4 per questo (proprio come pensavi anche tu) ma io non so se esiste già un modello completo esistente per questo. Ma penso che un tale modello possa essere scritto abbastanza facilmente usando la riflessione. –

risposta

0

Se mi trovai di fronte con il problema originale, avevo messo IProfile nella tua libreria condivisa, a fianco della classe Profile. Il tuo progetto web può quindi implementare la classe GenericProfile di cui ha bisogno, nient'altro ha bisogno di saperlo e altri client della libreria possono fare lo stesso necessario. Sarebbe anche utile per testare la libreria.

2

Non capisco completamente cosa si sta tentando di realizzare, ma di seguito è come vorrei generare una classe wrapper con ReSharper.

Personalmente se il mio datore di lavoro non vuole pagare per ReSharper, lo compro. Mi rende uno sviluppatore migliore. Vi consiglio caldamente di considerare l'acquisto come un investimento nella vostra carriera. Anti-Disclaimer - Non sono affatto collegato o sponsorizzato da ReSharper."Implementazione delegato di"

  1. aggiungere l'interfaccia per la classe che si desidera essere la classe involucro

    class MyWebElement : IWebElement { } 
    

  1. Trova/Click YourInterfaceHere "in un nuovo campo Delegate Implementation

  1. selezionare le opzioni Delegate options

  1. Fare clic su Fine e godetevi la vostra nuova classe

    class MyWebElement : IWebElement 
    { 
        private IWebElement _webElementImplementation; 
        public IWebElement FindElement(By @by) 
        { 
         return _webElementImplementation.FindElement(@by); 
        } 
    
        public ReadOnlyCollection<IWebElement> FindElements(By @by) 
        { 
         return _webElementImplementation.FindElements(@by); 
        } 
    
        public void Clear() 
        { 
         _webElementImplementation.Clear(); 
        } 
    
        public void SendKeys(string text) 
        { 
         _webElementImplementation.SendKeys(text); 
        } 
    
        public void Submit() 
        { 
         _webElementImplementation.Submit(); 
        } 
    
        public void Click() 
        { 
         _webElementImplementation.Click(); 
        } 
    
        public string GetAttribute(string attributeName) 
        { 
         return _webElementImplementation.GetAttribute(attributeName); 
        } 
    
        public string GetCssValue(string propertyName) 
        { 
         return _webElementImplementation.GetCssValue(propertyName); 
        } 
    
        public string TagName 
        { 
         get { return _webElementImplementation.TagName; } 
        } 
    
        public string Text 
        { 
         get { return _webElementImplementation.Text; } 
        } 
    
        public bool Enabled 
        { 
         get { return _webElementImplementation.Enabled; } 
        } 
    
        public bool Selected 
        { 
         get { return _webElementImplementation.Selected; } 
        } 
    
        public Point Location 
        { 
         get { return _webElementImplementation.Location; } 
        } 
    
        public Size Size 
        { 
         get { return _webElementImplementation.Size; } 
        } 
    
        public bool Displayed 
        { 
         get { return _webElementImplementation.Displayed; } 
        } 
    } 
    
Problemi correlati