MVVM とポータブル ライブラリを使用するこの素晴らしい例を見つけ、非常に便利であることがわかりました。自分のプロジェクトやソリューションで使い始めたいと思っています。MVVM パターンを満たすこの例で、現在の Windows Phone アプリを移植し始めました。SQLCE のようなローカル データベースを抽象化する方法がわかりません。
私の非MVVMソリューションは次のようなものでした:
DataContext
public class ChallengeDataContext : DataContext
{
public const string ConnectionString = "isostore:/challenges.sdf";
public ChallengeDataContext(string connectionString)
: base(connectionString)
{
this.Challenges = this.GetTable<Challenge>();
}
public Table<Challenge> Challenges { get; set; }
}
リポジトリ
public class ChallengeRepository
{
public static void Initialize()
{
using (ChallengeDataContext dc = new ChallengeDataContext(ChallengeDataContext.ConnectionString))
{
if (dc.DatabaseExists() == false)
{
dc.CreateDatabase();
dc.SubmitChanges();
}
}
}
public static void SeedSampleData()
{
using (ChallengeDataContext dc = new ChallengeDataContext(ChallengeDataContext.ConnectionString))
{
if (dc.DatabaseExists() != false && dc.Challenges.Count() == 0)
{
var challenge = new Challenge("Testing", 3, ChallengeKind.Writting, false);
dc.Challenges.InsertOnSubmit(challenge1);
dc.SubmitChanges();
}
}
}
public Challenge GetChallengeRandomly(int difficulty, ChallengeKind kind)
{
using (ChallengeDataContext dc = new ChallengeDataContext(ChallengeDataContext.ConnectionString))
{
var challenge = (from ch in dc.Challenges
where ch.Difficulty == difficulty && ch.Kind == kind && ch.Shown == false
select ch).FirstOrDefault();
return challenge;
}
}
public void SaveChallenge(Challenge challenge)
{
using (ChallengeDataContext dc = new ChallengeDataContext(ChallengeDataContext.ConnectionString))
{
dc.Challenges.InsertOnSubmit(challenge);
dc.SubmitChanges();
}
}
public void UpdateChallengeShownAttribute(int id, bool shown)
{
using (ChallengeDataContext dc = new ChallengeDataContext(ChallengeDataContext.ConnectionString))
{
var challenge = (from ch in dc.Challenges
where ch.Id == id
select ch).FirstOrDefault();
if (challenge != null)
{
challenge.Shown = shown;
dc.SubmitChanges();
}
}
}
public void UpdateChallengeShownAttribute(int difficulty, ChallengeKind kind, bool shown)
{
using (ChallengeDataContext dc = new ChallengeDataContext(ChallengeDataContext.ConnectionString))
{
var challenges = from ch in dc.Challenges
where ch.Kind == kind && ch.Difficulty == difficulty
select ch;
foreach (var challenge in challenges)
{
challenge.Shown = shown;
}
dc.SubmitChanges();
}
}
}
チャレンジクラス
[Table(Name = "Challenges")]
public class Challenge
{
[Column(IsPrimaryKey = true,IsDbGenerated=true)]
public int Id { get; set; }
[Column]
public string Name { get; set; }
[Column]
public int Difficulty { get; set; }
[Column]
public ChallengeKind Kind { get; set; }
[Column]
public bool Shown { get; set; }
public Challenge()
{
}
public Challenge(string name, int difficulty, ChallengeKind kind, bool shown)
{
Name = name;
Difficulty = difficulty;
Kind = kind;
Shown = shown;
}
}
public enum ChallengeKind
{
Writting,
Telling,
Pantomime
}
私は基本を知っており、インターフェイスを作成するのは問題ありませんが、すべてのプロジェクトで使用できるモデル クラスを変更する方法がわかりません (属性を DataContract と DataMember に変更できますが、それを SQLCE で使用するにはどうすればよいですか?)。次に、どのプロジェクトでリポジトリを実装する必要がありますか? コードはすべてのプラットフォームで同じですが、Windows 8 は SQLCE を使用していないと思います。では、これをどのように数えますか?手伝ってくれてありがとう