2011-08-31 28 views
8

Điều này phải đơn giản, nhưng tôi không thể tìm thấy bất kỳ thứ gì ngoài đó.Tự động tạo lớp Trình bao bọc trong C# bằng cách sử dụng Thành phần

Tôi có một lớp trong một lắp ráp (một thư viện chia sẻ - đó là một tập hợp các lớp proxy cho một dịch vụ Web) Tôi có một lớp trong một lắp ráp (dự án web)

Có một lớp được gọi là " Tiểu sử "trong hội đồng Proxy. Có một tập hợp các lớp học "sử dụng" một Cấu hình trong dự án web. Khi không có người dùng đăng nhập, một GenericProfile được sử dụng.

Theo nguyên tắc "tách mối quan tâm" .... Hội đồng proxy được sử dụng bởi các dự án khác và chỉ liên quan đến công cụ Dịch vụ web. Dự án web chỉ có nội dung trên web ở đó

Tuy nhiên, hiện tại cần có "GenericProfile" - hãy nghĩ nó là "Người dùng khách".

Điều hợp lý cần làm là xây dựng một giao diện được gọi là IProfile và khiến cả hai lớp bắt nguồn từ nó. Nhưng điều đó sẽ tạo ra sự phụ thuộc vòng tròn giữa hai hội đồng.

Ý tưởng tốt nhất tiếp theo là tạo một hội đồng thứ 3 có tên là MyInterfaces và đặt IProfile vào đó - nhưng điều đó gây ra sự vi phạm nguyên tắc Tách mối quan tâm theo ý kiến ​​của tôi. Ít nhất, một ví dụ của vấn đề này có vẻ quá nhỏ để làm một mô đun phụ trong giải pháp của tôi.

Nhập lớp wrapper - hoặc lớp wrapper Composite (bất cứ điều gì bạn muốn gọi nó)

Tôi đang tìm kiếm cái gì đó kết thúc lên tạo ra một cái gì đó như thế này dưới đây. Có một công cụ hoặc phần mở rộng Visual Studio sẽ làm điều đó? Có thể là tệp .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

Và có vẻ như ai đó đã hỏi một cái gì đó tương tự như thế này ... http://stackoverflow.com/ques tions/2150416/tạo-pass-through-code-khi-thích-thành-over-thừa kế – 010110110101

+0

Tôi không có ReSharper mặc dù ... – 010110110101

+1

Tôi sẽ sử dụng T4 cho điều này (giống như bạn nghĩ là tốt) nhưng tôi không biết nếu đã có một mẫu hoàn chỉnh tồn tại cho điều này. Nhưng tôi nghĩ rằng một mẫu như vậy có thể được viết khá dễ dàng bằng cách sử dụng sự phản chiếu. –

Trả lời

0

Nếu tôi đã phải đối mặt với vấn đề ban đầu của bạn, tôi muốn đưa IProfile trong thư viện chia sẻ của bạn, cùng với các lớp Profile. Sau đó, dự án web của bạn có thể triển khai lớp học GenericProfile mà nó cần, không có gì khác cần biết về nó và các ứng dụng khách khác của thư viện có thể thực hiện tương tự khi cần. Nó cũng sẽ hữu ích cho việc kiểm tra thư viện.

2

Tôi không hoàn toàn hiểu những gì bạn đang cố gắng hoàn thành, nhưng dưới đây là cách tôi sẽ tạo ra một lớp bao bọc với ReSharper.

Cá nhân nếu chủ lao động của tôi không muốn thanh toán cho ReSharper, tôi mua nó. Nó làm cho tôi trở thành một nhà phát triển tốt hơn. Tôi đề nghị bạn nên xem xét nó như một sự đầu tư trong sự nghiệp của bạn. Anti-Disclaimer - Tôi không ở tất cả các kết nối với hoặc tài trợ bởi ReSharper.

  1. thêm giao diện đến lớp bạn muốn được gói lớp

    class MyWebElement : IWebElement { } 
    

  1. Tìm/Nhấp vào "Đại biểu thực hiện" YourInterfaceĐưa "tới trường mới Delegate Implementation

  1. Chọn tùy chọn của bạn Delegate options

  1. Bấm kết thúc và tận hưởng đẳng cấp mới của bạn

    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; } 
        } 
    } 
    
Các vấn đề liên quan