1

新しいエンティティオブジェクトの作成時にデータベースで定義されたデフォルト値にドメインモデルがアクセスできるようにするための、適切でクリーンな方法を見つけようとしています。FacebookConnectを使用して自分のWebサイトの新しいユーザーを作成しているとします。Facebookユーザーに国が設定されているかどうかわからないため、新しいエンティティを作成するときにデフォルトの国にアクセスする必要があります。

これまでのところ、GetDefaultCountry()という単一のメソッドを使用してドメインサービスを作成しました。おそらくもっと多くのことが来るでしょう。

ISettingsService.cs(ドメインサービス):

public interface ISettingsService
{
    Country GetDefaultCountry();
}

設定サービスはインフラストラクチャ層に実装されており、UnitOfWorkからアクセスできます。次に、設定サービスを引数として取るファクトリを作成しました。これは、ユーザーエンティティの作成を担当します。

UserFactory.cs(ドメインファクトリ):

public class UserFactory
{
    private ISettingsService _settings;

    public UserFactory(ISettingsService settings)
    {
        _settings = settings;
    }
    public User CreateFacebookUser(string facebookUserId)
    {
        var user = new User();

        user.AccountType = AccountType.Facebook;
        user.ExternalId = facebookUserId;
        user.Country = _settings.GetDefaultCountry();
        user.Timestamp = DateTime.Now;

        return user;
    }
}

そして、これは私のユーザーサービスがどのように見えるかです。

UserService.cs(アプリケーションサービス):

using (var uow = new UnitOfWork())
{
    UserFactory factory = new UserFactory(uow.GetSettingsService());

    var user = factory.CreateFacebookUser(facebookUserId);
    ...
    uow.Save(user);
    uow.SubmitChanges();
}

私の質問は、私は正しい方向に進んでいるのかということです。ドメインサービスを介してデフォルトにアクセスしても大丈夫ですか?

4

1 に答える 1

2

デフォルトの国の定義によっては、より良い代替案があるかもしれませんが、あなたの解決策は問題ないようです。

  • コードでデフォルトを定義する場合(たとえば、Countryが値オブジェクトの場合)、静的なCountry.Defaultプロパティのようなものがあると便利です。_settings.GetDefaultCountry()よりも複雑さが少なく、流暢です。

  • Countryが、ブール値のIsDefaultフィールドを使用してデータベースに格納されている本格的なエンティティである場合、GetDefaultCountry()メソッドにはリポジトリが適していると思います。ただし、そのためだけにリポジトリを作成することはしません。

于 2012-05-24T12:49:04.293 に答える