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# 不允许您仅根据返回类型重载方法 - 在确定两个方法是否具有相同的签名时仅考虑方法参数。

唯一的解决方案是稍微调整您的 API 设计。

编辑:抱歉,当我重读您的问题时,我意识到您已经知道错误的原因,并且正在寻找如何重新设计您的 API。所以请忽略我的回答!

于 2012-08-02T07:44:21.800 回答
0

考虑到本质上您有一种方法可以仅基于一个给定参数来决定哪个(多/两个)视图模型返回最优雅的解决方案,这将是定义一个返回 ViewModel 超类的方法(完全按照定义你的界面)

于 2012-08-02T07:39:32.047 回答
0

如果我了解您的设计,您的SiteMapper 基本上是一个工厂,让您的 SiteMapper 方法 MapDomainToView返回给定 Site 的 ViewModel 列表,添加一个方法,您可以在其中为特定站点注册 ViewModel,例如将此映射存储在 Dictionary 中。

或者使用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 回答