A case for the anemic model?

As most of you are aware, I’ve been going through my projects and reworking things according to domain driven design. After altering several classes, I sat back and took a look at the overall picture. What I discovered was that things still looked very anemic. There just aren’t enough “business” concepts to work into the model, so things look very bland. Most of the logic surrounds what a user can do, and some common sense sanity checks. Take a look at the model below (an actual file), and tell me if I could’ve done something better, or if this is a case where using a plain data model would work better than a domain model, and simply handle this logic in a service layer?

using System;
using System.Collections.Generic;
using System.Security.Principal;
namespace Venue.Domain
{
using Venue.Infrastructure.Specifications.Constraints;
using Venue.Resources;
public class Category
{
private IList<Forum> forums = new List<Forum>();
public virtual int Id { get; protected set; }
public virtual int Sequence { get; protected set; }
public virtual string Title { get; protected set; }
public virtual string Description { get; protected set; }
public virtual bool Moderated { get; protected set; }
public virtual bool Enabled { get; protected set; }
public virtual bool Visible { get; protected set; }
public virtual IEnumerable<Forum> Forums { get { return forums; } }
protected Category() { }
public Category(IPrincipal user, string title)
{
SetTitle(user, title);
}
public virtual void SetSequence(IPrincipal user, int sequence)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
if (new IsLessThanZero().IsSatisfiedBy(sequence))
throw new Exception(Locale.sequence_out_of_range);
Sequence = sequence;
}
public virtual void SetTitle(IPrincipal user, string title)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
if (new IsNullOrEmpty().Or(new IsNullOrWhiteSpace()).IsSatisfiedBy(title))
throw new Exception(Locale.title_is_required);
Title = title.Trim();
}
public virtual void SetDescription(IPrincipal user, string description)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
if (new IsNull().IsSatisfiedBy(description))
description = string.Empty;
Description = description.Trim();
}
public virtual void SetModerated(IPrincipal user, bool moderated)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
Moderated = moderated;
}
public virtual void SetEnabled(IPrincipal user, bool enabled)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
Enabled = enabled;
}
public virtual void SetVisible(IPrincipal user, bool visible)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
Visible = visible;
}
public virtual void AddForum(IPrincipal user, Forum forum)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
if (new IsInList<Forum>(forums).IsSatisfiedBy(forum))
throw new Exception(Locale.duplicate_item_found);
forums.Add(forum);
}
public virtual void MoveForum(IPrincipal user, Forum forum, Category destination)
{
RemoveForum(user, forum);
destination.AddForum(user, forum);
}
public virtual void RemoveForum(IPrincipal user, Forum forum)
{
if (new IsAdministrator().Not().IsSatisfiedBy(user))
throw new Exception(Locale.user_is_not_authorized);
if (new IsInList<Forum>(forums).Not().IsSatisfiedBy(forum))
throw new Exception(Locale.missing_item_found);
forums.Remove(forum);
}
}
}