LINQ to SQL Covariance - 这是正确的方法吗?

时间:2010-01-21 17:45:57

标签: c# linq-to-sql generics covariance

我有几个数据库 - 大象,长颈鹿,大猩猩等 - 每个都有一个名为ElephantInputs,ElephantResults,GiraffeInputs,GiraffeResults,GorillaInputs,GorillaResults的输入和结果表。我无法控制表命名。

我正在使用LINQ to SQL自动生成ElephantInputs,ElephantResults,GiraffeInputs,GiraffeResults等类。

我想编写一个单独的类Processor(),它可以从任何这些数据库中读取输入并对其进行处理。我有一个Factory方法,根据用户的选择实例化处理器。

我做的第一件事是为Input和Result对象创建一个接口,为每个数据库创建一个partial类,以便它的输入和结果对象实现该接口。这给了我一个每个动物的共同界面。我还为每个数据库创建了一个存储库类,它有一些方法可以从数据库中返回项目。

public interface IBaseInput
{
    int ID { get; set; }
    string InputA { get; set; }
    int InputB { get; set; }
    double InputC { get; set; }
}

public interface IBaseResult
{
    int ID { get; set; }
    string ResultA { get; set; }
    int ResultB { get; set; }
    double ResultC { get; set; }
}

public interface IRepository<I, R>
    where I : IBaseInput
    where R : IBaseResult
{
    IQueryable<I> GetInputs();
    IQueryable<R> GetResults();
}

public partial class GorillaInput : IBaseInput
{
}

public partial class GorillaResult : IBaseResult
{
}

    // A concrete repository for Gorillas
    public class GorillaRepository : IRepository<GorillaInput, GorillaResult>
    {

    GorillaDataContext db = new GorillaDataContext(GetConnectionString("Gorillas"));

    public IQueryable<GorillaInput> GetInputs()
    {
        return from p in db.GorillaInputs select p;
    }

    public IQueryable<GorillaResult> GetResults()
    {
        return from r in db.GorillaResults select r;
    }
}

接下来,我为我的处理器

创建了一个界面
public interface IProcessor
{
    void Process();
}

这是一个具体的处理器,以及创建它的工厂。

public class Processor<T, I, R> : IProcessor
    where T : class, IRepository<I, R>, new()
    where P : IBaseInput
    where R : IBaseResult
{

    public void Process()
    {
        // Do some stuff ...

        T repository = new T();  // Get results from the rater tables
        IEnumerable<I> inputs = repository.GetInputs();
        IEnumerable<R> results = repository.GetResults();

        // Do some stuff with inputs and outputs...
    }
}

public static class ProcessorFactory
{
    public static IProcessor GetProcessor(string animal)
    {
        switch (animal) {
            case "Elephant":
                return new Processor<ElephantRepository, ElephantInput, ElephantResult>();
            case "Giraffe":
                return new Processor<GiraffeRepository, GiraffeInput, GiraffeResult>();
            case "Gorilla":
                return new Processor<GorillaRepository, GorillaInput, GorillaResult>();
            default:
                return null;
        }
    }
}

最后,这是调用处理器的程序:

class Program
{
    public static void Main()
    {
        IProcessor processor = ProcessorFactory.GetProcessor("Gorilla");
        processor.Process();
    }
}

我这样做了吗?有没有那么复杂的方式? 感谢

1 个答案:

答案 0 :(得分:2)

使用所有具体类型实现接口,为什么还要使用泛型呢?

public class Processor
{

    public void Process(IRepository repository)
    {
        // Do some stuff ...

        IEnumerable<IBaseInput> inputs = repository.GetInputs();
        IEnumerable<IBaseResult> results = repository.GetResults();

        // Do some stuff with inputs and outputs...
    }
}