2011-08-31 17 views
8

To powinno być proste, ale nie mogę tam niczego znaleźć.Automatyczne generowanie klasy Wrapper w języku C# przy użyciu kompozycji

Mam klasy w jednym zespole (wspólna biblioteka - to zestaw klas proxy dla usługi sieci Web) Mam klasy w innym montażowej (projekt WWW)

Istnieje klasa o nazwie " Profil ", który znajduje się w zespole proxy. Istnieje zestaw klas, które "używają" profilu w projekcie WWW. Gdy użytkownik nie jest zalogowany, używany jest GenericProfile.

Zgodnie z zasadą "rozdzielania obaw" ... Zespół proxy jest używany w innych projektach i dotyczy wyłącznie usług sieci Web. Projekt internetowy ma tylko elementy sieciowe.

Jednak istnieje już zapotrzebowanie na "Ogólny profil" - należy go traktować jako "Użytkownik-gość".

Logiczną rzeczą do zrobienia jest zbudowanie interfejsu o nazwie IProfile i spowodowanie wyprowadzenia z niego obu klas. Ale to spowodowałoby całkowitą zależność między tymi dwoma zespołami.

Następnym najlepszym pomysłem jest stworzenie trzeciego zespołu o nazwie MyInterfaces i umieszczenie w nim IProfile - ale moim zdaniem to narusza zasadę Separacji Zanieczyszczeń. Przynajmniej jedno wystąpienie tego problemu wydaje się zbyt małym powodem, dla którego warto stworzyć dodatkowy moduł w moim rozwiązaniu.

Wprowadź klasy otoki - lub Composite klasy otoki (cokolwiek chcesz to nazwać)

szukam czegoś, co kończy się generując coś takiego poniżej. Czy istnieje narzędzie lub rozszerzenie Visual Studio, które to zrobi? Może plik .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

Wygląda na to, że ktoś zapytał o coś podobnego ... http://stackoverflow.com/ques/2150416/generator-pass-through-code-when-preferring-composition-over-dziedziczenie – 010110110101

+0

Nie mam ReSharpera chociaż ... – 010110110101

+1

Używałbym do tego T4 (dokładnie tak jak myślałeś), ale ja nie wiem, czy istnieje już pełny szablon do tego. Ale myślę, że taki szablon można by napisać całkiem łatwo za pomocą refleksji. –

Odpowiedz

0

Gdybym miała do czynienia z oryginalnym problemu, chciałbym umieścić IProfile w udostępnionej biblioteki, obok klasy Profile. Twój projekt internetowy może wtedy zaimplementować klasę, której potrzebuje, nic więcej nie musi o niej wiedzieć, a inni klienci biblioteki mogą zrobić to samo, co potrzebne. Byłoby to również przydatne do testowania biblioteki.

2

Nie do końca rozumiem, co próbujesz osiągnąć, ale poniżej wyjaśniono, w jaki sposób wygenerowałbym klasę opakowania za pomocą programu ReSharper.

Osobiście, jeśli mój pracodawca nie chce płacić za ReSharper, kupuję go. To sprawia, że ​​jestem lepszym programistą. Zdecydowanie zalecamy rozważenie nabycia go jako inwestycji w swoją karierę. Anti-Disclaimer - w ogóle nie jestem połączony z firmą ReSharper ani nie jest przez nią sponsorowany.

  1. dodać interfejs do klasy chcesz być klasa owijania

    class MyWebElement : IWebElement { } 
    

  1. Znajdź/Kliknij "realizacja Delegat" YourInterfaceHere "do nowego pola Delegate Implementation

  1. Wybierz opcje Delegate options

  1. kliknij przycisk Zakończ i cieszyć się nową klasę

    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; } 
        } 
    } 
    
Powiązane problemy