代码之家  ›  专栏  ›  技术社区  ›  blu

使用Linq到Sql的接口进行解耦

  •  0
  • blu  · 技术社区  · 16 年前

    我正在将一个模型类重新分解为一个接口。模型类是使用Linq到Sql自动生成的。

    class FooRepository 
    {
        // ...
        public void Add(IFoo foo) 
        {
            db.Foos.InsertOnSubmit(foo);    
        }
    }
    

    InsertOnSubmit方法采用Foo的实例,而不是IFoo。我可以将实例内联转换为(Foo),这是可行的,但是有更干净的方法吗?

    我已经在使用StructureMap,是否可以向add方法添加一个属性以基于我的映射解析类型?

    或者我可以重写任何模型类方法,或者使用部分事件来实现这一点?

    2 回复  |  直到 16 年前
        1
  •  1
  •   James Black    16 年前

    为了将DLINQ模型与控制器分开,我倾向于不传递LINQ模型,而是使用控制器使用的不同模型,在调用DLINQ方法之前将其传递到我的类中。

    这样,如果数据库结构发生变化,只有DAO类(如FooRepository)必须改变,其他所有内容都会受到保护,不受连锁反应的影响。

    我不知道您是否想做这样的事情,但这将是一个比使用我期望的接口更简单的设计。

        2
  •  0
  •   Frank Tzanabetis    16 年前

    不知道这是否合适,但也许使用genrics可能是一个想法?

    class FooRepository<T>
    where T: class, IFoo, new() 
    {
        // ...
        public void Add(T foo) 
        {
            db.Foos.InsertOnSubmit(foo);    
        }
    }
    

    你可以这样做-

    Foo bar = new Foo();
    FooRepository<Foo> foo = new FooRepository<Foo>();
    bar.Add(bar);
    

    Bar bar = new Bar(); //Bar implements IFoo
    FooRepository<Bar> foo = new FooRepository<Bar>();
    bar.Add(bar);
    

    这样,FooRepository中的T实际上是一个Foo(或Bar),而不是一个IFoo,因此不需要强制转换,但是where子句中的限制意味着它必须实现IFoo,而Foo(和Bar)就是这样做的。