Автоматически сгенерировать класс Wrapper в C # с помощью Composition - PullRequest
10 голосов
/ 31 августа 2011

Это должно быть просто, но я ничего не могу найти там.

У меня есть класс в одной сборке (разделяемая библиотека - это набор прокси-классов для веб-службы) У меня есть класс в другой сборке (веб-проект)

Существует класс с именем "Профиль", который находится в сборке Proxy. Существует набор классов, которые «используют» профиль в веб-проекте. Когда пользователь не вошел в систему, используется GenericProfile.

Следуя принципу "разделения интересов" .... Сборка Proxy используется другими проектами и касается только содержимого веб-службы. В веб-проекте просто есть веб-материалы

Однако теперь существует потребность в «GenericProfile» - думайте о нем как «Гость».

Логическая вещь, которую нужно сделать - это создать интерфейс под названием IProfile и заставить оба класса наследовать его. Но это создаст круговую зависимость между двумя сборками.

Следующая лучшая идея - создать третью сборку под названием MyInterfaces и поместить туда IProfile - но это, на мой взгляд, нарушает принцип разделения проблем. По крайней мере, один экземпляр этой проблемы кажется слишком малой причиной для создания дополнительного модуля в моем решении.

Введите класс оболочки - или класс оболочки Composite (как хотите, чтобы он назывался)

Я ищу что-то, что в итоге генерирует что-то вроде этого ниже. Есть ли инструмент или расширение Visual Studio, которое сделает это? Может быть, файл .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; } }
   }

}

Ответы [ 3 ]

2 голосов
/ 11 января 2017

Я не совсем понимаю, чего вы пытаетесь достичь, но ниже я расскажу, как создать класс-оболочку с помощью ReSharper.

Лично, если мой работодатель не хочет платить за ReSharper, я его покупаю.Это делает меня лучшим разработчиком.Я настоятельно рекомендую вам рассмотреть возможность приобретения в качестве инвестиции в вашу карьеру.Anti-Disclaimer - я совсем не связан или не спонсируюсь ReSharper.

  1. добавить интерфейс к классу, который вы хотите быть классом упаковки

    class MyWebElement : IWebElement { }
    

Найти / Нажать «Делегировать реализацию« YourInterfaceHere »в новое поле Delegate Implementation
Выберите параметры Delegate options

Нажмите «Готово» и наслаждайтесь новым классом

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; }
    }
}
2 голосов
/ 24 апреля 2018

В Visual Studio 2017

Создайте свой класс

namespace WebProject
{
   public interface IProfile
   {...}

   class MyWrapperClass : IProfile
   {
      private IProfile _wrapped;
   }
}

, найдите курсор на IP-профиле класса MyWrapperClass: IProfile и нажмите Ctrl-.выберите Реализовать интерфейс через _wrapped.Нет необходимости в ReSharper.

0 голосов
/ 12 августа 2015

Если бы я столкнулся с вашей первоначальной проблемой, я бы поместил IProfile в вашу общую библиотеку вместе с классом Profile.Ваш веб-проект может затем реализовать класс GenericProfile, который ему нужен, больше ничего о нем не нужно знать, и другие клиенты библиотеки могут делать то же самое, что и нужно.Это также было бы полезно для тестирования библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...