1

我需要帮助使这种方法通用。重复大约十次以获得不同 Web 列表控件的列表(将“MyType”替换为特定控件中使用的类型)。

    private static IList<MyType> GetList(RequestForm form)
    {
        // get base list
        IMyTypeRepository myTypeRepository = new MyTypeRepository(new HybridSessionBuilder());
        IList<MyType> myTypes = myTypeRepository.GetAll();

        // create results list
        IList<MyType> result = new List<MyType>();

        // iterate for active + used list items
        foreach (MyType myType in myTypes)
        {
            if (myType.Active || form.SolutionType.Contains(myType.Value))
            {
                result.Add(myType);
            }
        }

        // return sorted results
        result.OrderBy(o => o.DisplayOrder);
        return result;
    }

如果这还不够信息,请告诉我。我认为这需要我刚刚熟悉的更高级的语言功能。也许我应该让他们都使用同一个存储库?

谢谢你的帮助。

编辑:感谢您的帮助。我没有任何同行支持,所以这个董事会很棒,我从你们每个人身上都学到了一些东西。我希望我能接受所有的答案。

4

4 回答 4

6

您可以首先使您的函数更简洁,如下所示:

private static IList<MyType> GetList(RequestForm form)
{
    // get base list
    IMyTypeRepository myTypeRepository =
        new MyTypeRepository(new HybridSessionBuilder());

    IList<MyType> myTypes = myTypeRepository.GetAll();

    return myTypes.Where(x => x.Active || form.SolutionType.Contains(x.Value))
                  .OrderBy(x => x.DisplayOrder).ToList();
}

此时,该功能的大部分内容都与 直接相关MyType,因此如何进一步改进它在很大程度上取决于MyType与所涉及的其他类型的相关性。例如,如果您的其他类型遵循(对我而言)看起来合理的合同,您可以编写一个假设版本:

private static IList<T> GetList(RequestForm form) where T : OrderedValueContainer
{
    // we'll want to somehow genericize the idea of a TypeRepository that can
    // produce these types; if that can't be done, we're probably better off
    // passing a repository into this function rather than creating it here

    var repository = new TypeRepository<T>(new HybridSessionBuilder());
    IList<T> myTypes = repository.GetAll();

    // the hypothetical OrderedValueContainer class/interface
    // contains definitions for Active, Value, and DisplayOrder

    return myTypes.Where(x => x.Active || form.SolutionType.Contains(x.Value))
                  .OrderBy(x => x.DisplayOrder).ToList();
}
于 2009-05-28T13:19:22.577 回答
4

如果所有类型都实现了相同的接口(如果它们没有实现它们,并确保将所有属性添加到此方法所需的接口),那么您可以执行以下操作:

private static IList<T> GetList(RequestForm form)
       where T: IMyInterface
    {
        // get base list
        IMyTypeRepository myTypeRepository = new MyTypeRepository(new HybridSessionBuilder());
        IList<T> myTypes = myTypeRepository.GetAll();

        // create results list
        IList<T> result = new List<T>();

        // iterate for active + used list items
        foreach (T myType in myTypes)
        {
            if (myType.Active || form.SolutionType.Contains(myType.Value))
            {
                result.Add(myType);
            }
        }

        // return sorted results

        return result.OrderBy(o => o.DisplayOrder).ToList();
    }

我所做的另一项更改是最后一行,您将 orderby 放在单独的行上,并且从未真正捕获 Ordered 列表。

编辑:为了解决存储库问题,您可以拥有一个存储库工厂,它根据 T 的类型返回正确的存储库:

public static IMyTypeRepository  GetRepository(Type t)
{
   if(t == typeof(Type1))
   {
      return Type1Repository();
   }

   if(t == typeof(Type2))
   {
      return Type2Repository();
   }
   .......
}

当然,假设您的所有存储库都实现了 IMyRepository 接口。

于 2009-05-28T13:14:09.717 回答
2

首先,您的所有类型都必须实现一个通用interface的定义属性,例如ActiveValue...

另外,据我所知,必须有一个独立于所有存储库的存储库接口,MyType以便您可以使用这样的通用方法。该GetAll()方法应在IRepository.

public interface IRepository<T> where T : IMyType
{
    IList<T> GetAll();
}

public class RepositoryFactory
{
    public static IRepository<T> createRepository<T>(ISessionBuilder sb) where T : IMyType
    {
        // create repository
    }
}

public interface IMyType
{
    bool Active { get; }
    string Value { get; }
}

private static IList<T> GetList(RequestForm form) where T : IMyType
{
    // get base list
    IRepository<T> repository = RepositoryFactory.createRepository<T>(new HybridSessionBuilder());
    IList<T> myTypes = repository.GetAll();

    // create results list
    IList<T> result = new List<T>();

    // iterate for active + used list items
    foreach (T myType in myTypes)
    {
        if (myType.Active || form.SolutionType.Contains(myType.Value))
        {
            result.Add(myType);
        }
    }

    // return sorted results
    return result.OrderBy(o => o.DisplayOrder).ToList();
}
于 2009-05-28T13:42:09.363 回答
1

假设存储库共享一个通用接口,存储库的问题应该很容易解决:添加一个静态函数,例如


public static IRepository RepositoryForType(Type t)
{
    if(t == typeof(SomeClass))
       return new SomeClassRepository(new HybridSession());
    else if ...
    else throw new InvalidOperationException("No repository for type " + t.Name);
}

这应该要求您对现有代码进行最少的更改,但请注意,将来当您在项目中添加新存储库时,您必须在此函数中添加对新存储库的类支持(如果您正在使用单元测试你会很容易弄清楚你是否忘记了这个助手)。

于 2009-05-28T13:17:17.963 回答