使用Linq-to-Sql接口进行解耦

时间:2009-08-29 02:34:57

标签: c# interface structuremap decoupling

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

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

InsertOnSubmit方法接受Foo的实例,而不是IFoo。我可以将实例内联到(Foo),这样可行,但是有更简洁的方法吗?

我已经在使用StructureMap,我可以在Add方法中添加一个属性来根据我的映射来解析类型吗?

或者我可以覆盖任何模型类方法,或使用部分事件来完成此操作吗?

2 个答案:

答案 0 :(得分:1)

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

这样我可以在我的控制器中获得应用程序所需的属性,即使数据库中可能有许多其他属性。

这样,如果数据库结构只改变了DAO类,比如FooRepository,就必须改变,其他一切都不受涟漪效应的影响。

我不知道你是否想要做这样的事情,但它比使用我期望的接口更简单。

答案 1 :(得分:0)

Dunno,如果这适合,但也许使用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)就是这样做的