这应该很简单,但我找不到任何东西。
我在一个程序集中有一个类(一个共享库 - 它是一组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; } }
}
}
答案 0 :(得分:2)
我并不完全理解您要完成的任务,但下面是我将如何使用ReSharper生成包装器类。
就个人而言,如果我的雇主不想为ReSharper付款,我会买它。它让我成为更好的开发者。我强烈建议您考虑将其作为对您职业生涯的投资。反免责声明 - 我与ReSharper完全没有联系或赞助。
将接口添加到您希望成为包装类的类
class MyWebElement : IWebElement { }
点击完成并享受您的新课程
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
类,其他任何需要知道的内容,并且库的其他客户端可以根据需要执行相同的操作。它对于测试库也很有用。