2012-08-02 49 views
2

我知道這意味着什麼,但希望解決此問題。對於解決方案,我可以創建具有不同簽名的方法,但這不會讓我滿意。 我的方案是如下:具有相同簽名的會員已被聲明

public interface IDomainToViewMapper<TModel, TViewModel> 
{ 
    TViewModel MapDomainToView(TModel source); 
} 

public interface ISiteMapper : IDomainToViewMapper<Site, ViewModelOne>, 
           IDomainToViewMapper<Site, ViewModelTwo> 
{ } 

現在,當我寫我的主要實現類,我得到同樣的簽名問題成員。我可以繼續並明確地實現接口,但是因爲我們正在動態注入依賴關係,所以我無法轉換爲接口,這又會變得模糊不清。

public SiteMapper : ISiteMapper 
{ 
    public ViewModelOne MapDomainToView(Site site) { ... } 
    public ViewModelTwo MapDomainToView(Site site) { ... }  
} 

任何優雅的解決這一問題將是巨大的

+0

@MarcGravell是的,它是模糊的,如果允許C#,我可以將返回值轉換爲ViewModelOne和ViewModelTwo,它可以執行適當的方法。我可以在ISiteMapper等編寫MapToViewModelTwo方法,但我想讓我選擇大腦,看看有沒有辦法解決這個問題 – DotNetInfo 2012-08-02 07:58:40

回答

0

你SiteMapper基本上是一個如果我理解你的設計,讓你的SiteMapper方法MapDomainToView 返回的ViewModels列表指定網站,添加一個方法,你可以爲特定的網站上註冊的ViewModels,存儲此以字典爲例進行映射。

或者使用溫莎城堡或SiteMapper代替或SiteMapper可能是內部自己喜歡的IoC容器

例子:

public interface IViewModel 
{ 
} 

public class ViewModelOne : IViewModel 
{ 
} 

public class ViewModelTwo : IViewModel 
{ 
} 


public class SiteMapper 
{ 
    private Dictionary<Site, List<IViewModel>> map { get; set; } 

    public void Register(Site site, IViewModel viewModel) 
    { 
     // Add combination to map 
    } 

    public List<IViewModel> MapDomainToViews(Site site) 
    { 
     if (map.ContainsKey(site)) 
      return map[site]; 
     else 
      .... 
    } 
} 

這是一個簡單的IoC,如果你出去走這條路線檢查城堡,團結,NInject等

+0

你可以請虛擬一些代碼,如果可能 – DotNetInfo 2012-08-02 08:00:19

+0

看到更新上面 – 2012-08-02 08:13:24

+0

謝謝,你的解決方案絕對是一個看看,但在我的目前情況,涉及到一點變化。我正在重命名像MapToViewModelOne,MapToViewModelTwo和其他方法。謝謝 – DotNetInfo 2012-08-02 22:57:04

0

考慮,你有本質上的一種方法,其可以決定僅僅基於一個給定的參數,它的(多/兩)視圖模型的返回最優雅的解決方案將是定義一個方法返回您的ViewModel的超類(完全按照您的界面定義)

2

這是因爲c#不允許您僅基於返回類型重載方法 - 只有方法參數是在確定兩種方法是否具有相同的簽名時需要考慮。

唯一的解決方案是稍微調整你的API設計。

編輯:對不起,當我重讀你的問題時,我意識到你已經知道錯誤的原因,並正在尋找如何重新設計你的API。所以請忽略我的回答!

+0

我該如何調整我的API設計,這給了我一個優雅的解決方案。考慮到網站是主要的領域類,會有很多視圖使用這個類來獲取它的視圖模型 – DotNetInfo 2012-08-02 08:04:21

相關問題