SORU
28 EYLÜL 2009, PAZARTESİ


Kansız etki modelleri önlemek için nasıl, ya da hizmetleri varlıklar yöntemleri taşımak için zaman

İnsanlar DDD ve genel olarak Etki alanı Modelleme ile daha deneyimli bazı rehberlik için arıyorum bu ortak bir senaryo var.

Demek dışarıda bir blog motoru oluşturmaya başladım, ve ilk şartı bir Makale yayınlanmıştır sonra, kullanıcılar hakkında Yorum gönderme başlayabilirsiniz. Bu iyi bir başlangıç, ve aşağıdaki tasarım olur:

public class Article
{
    public int Id { get; set; }

    public void AddComment(Comment comment)
    {
        // Add Comment
    }
}

MVC benim Denetleyicisi bu gibi tasarlanmıştır:

public class ArticleController
{
    private readonly IRepository _repository;

    public ArticleController(IRepository repository)
    {
        _repository = repository;
    }

    public void AddComment(int articleId, Comment comment)
    {
        var article = _repository.Get<Article>(articleId);
        article.AddComment(comment);
        _repository.Save(article);
        return RedirectToAction("Index");
    }
}

Şimdi her şey gayet iyi çalışıyor ve ihtiyacı karşılıyor. Her zaman bir Yorum bir gereklilik alırız yineleme sonra, blog yazarı, onu bildiren bir e-posta almalısınız.

Bu noktada aklıma gelen 2 seçenek var. 1) bir Makale İEmailService (decimal?) gerektirecek Değiştir ya benim Dİ konteyner için statik bir referans bir EmailService edinin

1a) çok çirkin Görünüyor. Benim varlıklar hizmetlerin farkında olan bazı Etki alanı modeli kuralları alt üst ediyor sanırım?

public class Article
{
    private readonly IEmailService _emailService;

    public Article(IEmailService emailService)
    {
        _emailService = emailService;
    }

    public void AddComment(Comment comment)
    {
        // Add Comment

        // Email admin
        _emailService.SendEmail(App.Config.AdminEmail, "New comment posted!");
    }
}

1b) Da çirkin görünüyor, ben artık erişilebilir statik olarak yapılandırılmış olan Dİ bir kap gerektirir.

public class Article
{
    public void AddComment(Comment comment)
    {
        // Add Comment

        // Email admin
        var emailService = App.DIContainer.Resolve<IEmailService>();
        emailService.SendEmail(App.Config.AdminEmail, "New comment posted!");
    }
}

2) bir İArticleService Oluşturmak ve AddComment hareket() Madde Varlık kendisini bu hizmeti yerine. yöntem

Bu çözüm inanıyorum temiz, ama bir yorum Eklemek artık daha kolay keşfedilir ve bir ArticleService çalışmayı gerektirir. AddComment Madde sınıfının kendisine ait gibi görünüyor.

public class ArticleService
{
    private readonly IEmailService _emailService;

    public ArticleService(IEmailService emailService)
    {
        _emailService = emailService;
    }

    public void AddComment(Article article, Comment comment)
    {
        // Add comment

        // Email admin
        _emailService.SendEmail(App.Config.AdminEmail, "New comment posted!");
    }

}


public class ArticleController
{
    private readonly IRepository _repository;
    private readonly IArticleService _articleService;

    public ArticleController(IRepository repository, IArticleService articleService)
    {
        _repository = repository;
        _articleService = articleService;
    }

    public void AddComment(int articleId, Comment comment)
    {
        var article = _repository.Get<Article>(articleId);
        _articleService.AddComment(article, comment);
        _repository.Save(article);
        return RedirectToAction("Index");
    }
}

İnsanların etki alanı modelleme profesyonel tavsiye için bakmak duyuyorum aslında. Eğer daha belirgin bir çözüm kaçırıyorum varsa lütfen bana bildirin :)

Ben genellikle her iki çözüm Hizmeti seçeneği az keşfedilebilir çünkü dürüst olmak gerekirse, sevmediğim. Artık bir ArticleService gerek kalmadan bir Makale örneği için bir Yorum ekleyebilirsiniz. Ayrıca AddComment Yazı tipi bu kadar bariz bir yöntem gibi görünüyor çünkü daha doğal hissediyor.

Neyse giriş ileri okuma için sabırsızlanıyoruz. Şimdiden teşekkürler.

CEVAP
28 EYLÜL 2009, PAZARTESİ


Bu konuda zarif Domain Event ile çözülebilir sanırım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Besnik Ibrahimi

    Besnik Ibrah

    27 Mart 2010
  • CaliforniaMetin

    CaliforniaMe

    3 ŞUBAT 2013
  • Jimmie Jones

    Jimmie Jones

    16 Kasım 2007