Использование интерфейсов с Linq-to-Sql для развязки - PullRequest
0 голосов
/ 29 августа 2009

Я перевожу класс модели в интерфейс. Класс модели генерируется автоматически с помощью Linq-to-Sql.

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

Метод InsertOnSubmit принимает экземпляр Foo, а не IFoo. Я могу привести экземпляр inline к (Foo), и это работает, но есть ли более чистый способ сделать это?

Я уже использую StructureMap. Могу ли я добавить атрибут в метод Add для разрешения типа на основе моих сопоставлений?

Или я могу переопределить любой из методов классов модели или использовать для этого частичные события?

Ответы [ 2 ]

1 голос
/ 29 августа 2009

Чтобы отделить модель DLINQ от контроллера, я стараюсь не передавать модель LINQ, а имею другую модель, которая используется контроллером, которая передается в мой класс перед вызовом методов DLINQ.

Таким образом, в моем контроллере могут быть только те свойства, которые необходимы приложению, хотя в базе данных может быть много других свойств.

Таким образом, если структура базы данных изменится, только класс DAO, такой как FooRepository, должен измениться, все остальное защищено от эффекта ряби.

Я не знаю, хотите ли вы сделать что-то подобное, но это было бы проще, чем использовать ожидаемые интерфейсы.

0 голосов
/ 28 января 2010

Не знаю, подойдет ли это, но, возможно, было бы неплохо использовать генетику?

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);

Таким образом, T в FooRepository на самом деле является Foo (или Bar), а не IFoo, поэтому приведение не требуется, но ограничение в предложении where означает, что он должен реализовывать IFoo, что делает Foo (и Bar) .

...