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) { ... }      
}

この問題に対するエレガントな解決策は素晴らしいでしょう

4

3 に答える 3

3

これは、C# では、戻り値の型だけに基づいてメソッドをオーバーロードできないためです。2 つのメソッドが同じシグネチャを持つかどうかを判断するときに、メソッド パラメーターのみが考慮されます。

唯一の解決策は、API の設計を少し調整することです。

編集:申し訳ありませんが、あなたの質問を読み直したところ、エラーの原因をすでに知っていて、APIを再設計する方法を探していることに気付きました。だから私の答えを無視してください!

于 2012-08-02T07:44:21.800 に答える
0

本質的に、与えられた 1 つのパラメーターのみに基づいて (多く/2 つの) ビュー モデルのどれが最も洗練されたソリューションを返すかを決定できる 1 つのメソッドがあることを考慮すると、ViewModel のスーパークラスを返すメソッドを 1 つだけ定義することになります (正確に で定義されているとおり)。あなたのインターフェース)

于 2012-08-02T07:39:32.047 に答える
0

私があなたのデザインを理解している場合、あなたの SiteMapper は基本的にFactoryです。SiteMapper メソッド MapDomainToViewが特定の Site の ViewModels のリストを返すようにし、特定の Site の ViewModels を登録できるメソッドを追加し、このマッピングをディクショナリに保存します。

または、Castle Windsorまたはお気に入りの IoC コンテナーを SiteMapper の代わりに使用するか、SiteMapper の内部で使用することもできます

例:

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 です。このルートに進む場合は、Castle、Unity、NInject などを確認してください。

于 2012-08-02T07:51:36.630 に答える