使用Composition在C#中自动生成Wrapper类

时间:2011-08-31 03:28:30

标签: c# visual-studio

这应该很简单,但我找不到任何东西。

我在一个程序集中有一个类(一个共享库 - 它是一组Web服务的代理类) 我在另一个程序集(Web项目)中有一个类

在Proxy程序集中有一个名为“Profile”的类。 有一组类在Web项目中“使用”一个Profile。 如果没有用户登录,则使用GenericProfile。

遵循“关注点分离”的原则.... Proxy程序集由其他项目使用,仅与Web Service有关。 网络项目只有网络内容

然而,现在需要一个“GenericProfile” - 将其视为“访客用户”。

要做的合乎逻辑的事情是构建一个名为IProfile的接口,并使两个类从它派生。但这会在两个组件之间产生循环依赖。

下一个最好的想法是创建一个名为MyInterfaces的第三个程序集并将IProfile放在那里 - 但是在我看来这会导致违反“关注点分离”原则。至少,这个问题的一个例子似乎太小了,无法在我的解决方案中制作额外的模块。

输入包装类 - 或复合包装类(无论你想调用它)

我正在寻找最终产生如下内容的东西。是否有工具或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 个答案:

答案 0 :(得分:2)

我并不完全理解您要完成的任务,但下面是我将如何使用ReSharper生成包装器类。

就个人而言,如果我的雇主不想为ReSharper付款,我会买它。它让我成为更好的开发者。我强烈建议您考虑将其作为对您职业生涯的投资。反免责声明 - 我与ReSharper完全没有联系或赞助。

  1. 将接口添加到您希望成为包装类的类

    class MyWebElement : IWebElement { }
    
    1. 查找/单击“将”YourInterfaceHere“的实施委派给新字段 Delegate Implementation
      1. 选择您的选项 Delegate options
        1. 点击完成并享受您的新课程

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

答案 1 :(得分:2)

在Visual Studio 2017中

创建班级

namespace WebProject
{
   public interface IProfile
   {...}

   class MyWrapperClass : IProfile
   {
      private IProfile _wrapped;
   }
}

将光标定位在MyWrapperClass类的IProfile上:IProfile并按ctrl-。选择通过_wrapped实现接口。不需要ReSharper。

答案 2 :(得分:0)

如果我遇到了您的原始问题,我会将IProfile放在您的共享库中,与Profile类一起放置。然后,您的Web项目可以实现它需要的GenericProfile类,其他任何需要知道的内容,并且库的其他客户端可以根据需要执行相同的操作。它对于测试库也很有用。