我有以下代码
foreach (var obj in MyList)
{
// BL
repository.Add(obj)
// BL
repository.Update(obj)
}
我有两个实现IRepository的类。一个类使用MsSql,一个使用内存。 内存中实现使用List来存储我的数据。 如果我使用MsSql类,则所有数据都已存储在DB中。 如果我使用内存,那么我需要在foreach循环之后将存储库列表中的所有数据插入到DB中。 我不确定这个OOP最好的方法是什么。
我可以将一个Save方法添加到IRepository,但这意味着MsSql类将实现一个它不需要的方法。 另一个选择是仅在内存类中添加一个方法,并执行以下操作:
IRepository rep = repository as InMemoryRepository
if (rep != null)
{
rep.Save()
}
你觉得怎么样?
答案 0 :(得分:0)
你应该在基础接口中拥有所有Repository实现(MSSQL,In-Memory)的通用方法。
SaveToDatabase是一种特定于内存的特定方法,应该是InMemory存储库实现类的一部分。不要将它作为基础接口的一部分,因为它对其他具体实现可能没有任何意义。
另一个选项是实现内存存储库的持久化方法,以便将其保存在列表中并将其保存在数据库中。 (虽然它是关注的混合)
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);
}
}