public Product(
                TenantId tenantId,
                ProductId productId,
                ProductOwnerId productOwnerId,
                string name,
                string description,
                DiscussionAvailability discussionAvailability)
        {
            this.TenantId = tenantId; // must precede productOwnerId for compare
            this.Description = description;
            this.Discussion = ProductDiscussion.FromAvailability(discussionAvailability);
            this.DiscussionInitiationId = null;
            this.Name = name;
            this.ProductId = productId;
            this.ProductOwnerId = productOwnerId; // TODO: validation currently missing

            DomainEventPublisher
                .Instance
                .Publish(new ProductCreated(
                        this.TenantId,
                        this.ProductId,
                        this.ProductOwnerId,
                        this.Name,
                        this.Description,
                        this.Discussion.Availability));
        }
 public ProductDiscussionRequested(
     TenantId tenantId,
     ProductId productId,
     ProductOwnerId productOwnerId,
     string name,
     string description,
     bool requestingDiscussion)
 {
     this.Description = description;
     this.EventVersion = 1;
     this.Name = name;
     this.OccurredOn = DateTime.Now;
     this.ProductId = productId;
     this.ProductOwnerId = productOwnerId;
     this.RequestingDiscussion = requestingDiscussion;
     this.TenantId = tenantId;
 }
 public ProductCreated(
     TenantId tenantId,
     ProductId productId,
     ProductOwnerId productOwnerId,
     string name,
     string description,
     DiscussionAvailability availability)
 {
     this.Availability = availability;
     this.Description = description;
     this.EventVersion = 1;
     this.Name = name;
     this.OccurredOn = DateTime.Now;
     this.ProductId = productId;
     this.ProductOwnerId = productOwnerId;
     this.TenantId = tenantId;
 }