2014-04-06 48 views
0

实现保存我有以下代码如何在内存中的存储库

foreach (var obj in MyList) 
{ 
    // BL 
    repository.Add(obj) 
    // BL 
    repository.Update(obj) 
} 

我有实现IRepository两班。一个类使用MsSql和一个内存。 内存中的实现使用List来存储我的数据。 如果我使用MsSql类,那么所有的数据已经存储在数据库中。 如果我使用内存中,那么我需要在foreach循环之后将存储库列表中的所有数据插入数据库。 我不确定什么是做这个OOP明智的最佳方式。

我可以将一个Save方法添加到IRepository,但这意味着MsSql类将实现一个它不需要的方法。 另一种选择是只在内存中的类添加一个方法,并做这样的事情:

IRepository rep = repository as InMemoryRepository 
if (rep != null) 
{ 
    rep.Save() 
} 

你觉得呢?

+2

“如果我使用内存中,那么我需要插入列表中的所有数据到数据库” - 我不明白这部分。 –

+0

@WiktorZychla由于数据存储在内存中,而不是数据库中,因此需要手动将数据保存到数据库中。 – Measuring

+0

为什么内存提供者需要将数据插入数据库? –

回答

0

您应该拥有基本接口中所有存储库实现(MSSQL,In-Memory)通用的方法。

SaveToDatabase是一种非常符合特定内存的方法,应该是InMemory存储库实现类的一部分。不要将它作为基础接口的一部分,因为它可能对其他具体实现没有任何意义。

另一种选择是实现内存中存储库的persist方法,以便将其保存在列表中并将其保存在数据库中。 (虽然它是关注点混合)

public interface IRepository 
{ 
void Add(MyType object); 
} 

public class SqlRepository : IRepository 
{ 
public void Add(MyType object) 
{ 
    // saves to DB 
} 
} 

public class InMemoryRepository : IRepository 
{ 
List<MyType> store = new List<MyType>(); 

public void Add(MyType object) 
{ 
    // saves to list store. 
    // may also, additionally store to DB. 
    IRepository dbRep = DependencyInjection.GiveMeDatabaseRepository<IRepository>(); 

    // null check so that if tomorrow, there is no SQL repository, this code doesn't break. 
    if (dbRep != null) 
    { 
    dbRep.Add(object); 
    } 
} 

// this is another explicit option 
public void AddToDatabase(MyType object) 
{ 
    IRepository dbRep = DependencyInjection.GiveMeDatabaseRepository<IRepository>(); 
    dbRep.Add(object); 
} 
} 
+0

第二个选项不好。看到我的答案马特 – Tsahi

+0

多数民众赞成在罚款..你不需要一次添加1个对象.. AddToDatabase可以**不** **需要一个参数,只需将商店对象中的所有项目保存到数据库中1击..答案的一点是,保存到数据库是列表存储库的一个非常具体的行为,不应该在界面' –

+0

我倾向于同意 – Tsahi

相关问题