web-dev-qa-db-ja.com

複数のストレージタイプの作業単位の実装

Windowsレジストリ、データベース、app.configなどの複数のストレージタイプの作業単位パターンを実装しようとしていますが、その方法がわかりません。私が見つけたすべての例は、すでにUoWであるEntity Frameworkを使用しているため、あまり役に立ちません。保存したいのは、単純なSettingオブジェクトです。

http://martinfowler.com/eaaCatalog/unitOfWork.html から

作業ユニットは、ビジネストランザクション中にデータベースに影響を与える可能性のあるすべてのことを追跡します。完了すると、作業の結果としてデータベースを変更するために実行する必要があるすべてのことがわかります。

したがって、おそらく2つの設定可能なプロパティと、ダーティで更新が必要かどうかを通知するプロパティを持つクラスから始める必要があります。

class Setting
{
    private string _value;

    public Setting(string name, string value)
    {
        Name = name;
        _value = value;
    }

    public string Name { get; set; }

    public string Value
    {
        get { return _value; }
        set
        {
            _value = value;
            IsDirty = true;
        }
    }

    public bool IsDirty { get; private set; }
}

それから私はベースリポジトリが必要だと思います:

abstract class SettingRepository
{
    private readonly List<Setting> _settings = new List<Setting>();

    public abstract IEnumerable<Setting> Get(Setting setting);

    public void Add(IEnumerable<Setting> settings)
    {
        _settings.AddRange(settings);
    }

    public abstract int SaveChanges();
}

SettingContextとしての作業単位:

abstract class SettingContext
{
    protected SettingContext(SettingRepository settings)
    {
        Settings = settings;
    }

    public SettingRepository Settings { get; }
}

ここで、すべてのUpdate/Insert/SaveChangesロジックをどこに配置すればよいかわかりませんか?たとえば、データベースはトランザクションをサポートしますが、Windowsレジストリはサポートしません。

ストレージタイプごとに異なるリポジトリが必要ですか、それともそれぞれに異なる作業単位、つまりコンテキストが必要ですか?私は本当に混乱しています。


次に何をすべきか正確にはわかりません。たぶん私は多くのエンティティフレームワークを考え、次のように非常に似た方法でそれを実装しようとします:

using(var context = new SettingContext(new RegistryRepository()))
{
    context.Settings.Add(new Setting("Foo", "Bar")); // this should be created
    context.Settings.Add(otherSetting); // this should be updated
    context.SaveChanges();
}
3
t3chb0t

あなたのアプローチは今のところ問題ありません。 「Unit-of-Work」クラスは、1つの「トランザクション」の「設定エンティティ」に対する変更を追跡する責任を負う必要があります(たとえば、コマンドまたは変更されたオブジェクトのリストを保持することでこれを行うことができます)。含まれるオブジェクトは複数あります)、抽象リポジトリはCRUD操作の抽象化を提供する必要があります(そのため、ストレージのタイプごとに1つの具体的なリポジトリ実装がありますが、問題ありません)。 「UoW」の「Commit」操作は、コマンドまたは変更されたオブジェクトをループし、注入されたリポジトリのCRUD操作を使用してデータ/変更を保存します。

ただし、管理する必要のあるすべてのデータが1つの設定オブジェクトにのみ含まれ、更新操作がそのオブジェクトを1つのトランザクションでストレージに書き込むだけの場合、「作業単位」アプローチを使用するのはおそらくやりすぎです。 UoWは、複数のオブジェクトが関与する複雑なトランザクションを囲む何らかの括弧が必要な場合に、より意味があります。 Settingsオブジェクトの場合、SaveSettingsLoadSettingsなどのメソッドを含むリポジトリで十分です。

1
Doc Brown