public DefaultSqlServerOutboxRepository(
     SqlTransaction sqlTransaction,
     ISqlTransactionalOutboxTableConfig outboxTableConfig = null,
     ISqlTransactionalOutboxItemFactory <Guid, TPayload> outboxItemFactory = null,
     int distributedMutexAcquisitionTimeoutSeconds = Defaults.DistributedMutexAcquisitionTimeoutSeconds
     )
     : base(
         sqlTransaction: sqlTransaction,
         outboxTableConfig: outboxTableConfig ?? new OutboxTableConfig(),
         outboxItemFactory: outboxItemFactory ?? new DefaultOutboxItemFactory <TPayload>(),
         distributedMutexAcquisitionTimeoutSeconds
         )
 {
     //Preconfigured defaults are used in base constructor above...
 }
        protected void Init(
            ISqlTransactionalOutboxTableConfig outboxTableConfig,
            ISqlTransactionalOutboxItemFactory <TUniqueIdentifier, TPayload> outboxItemFactory,
            int distributedMutexAcquisitionTimeoutSeconds = Defaults.DistributedMutexAcquisitionTimeoutSeconds
            )
        {
            //Possible Dependencies
            OutboxTableConfig = outboxTableConfig.AssertNotNull(nameof(outboxTableConfig));
            OutboxItemFactory = outboxItemFactory.AssertNotNull(nameof(outboxItemFactory));

            //Default Known setup for Sql Server...
            QueryBuilder             = new SqlServerTransactionalOutboxQueryBuilder <TUniqueIdentifier>(outboxTableConfig);
            DistributedMutexLockName = $"SqlServerTransactionalOutboxProcessor::{QueryBuilder.BuildTableName()}";
            DistributedMutexAcquisitionTimeoutSeconds = distributedMutexAcquisitionTimeoutSeconds;
        }
        public SqlServerOutboxRepository(
            SqlTransaction sqlTransaction,
            ISqlTransactionalOutboxTableConfig outboxTableConfig = null,
            ISqlTransactionalOutboxItemFactory <TUniqueIdentifier, TPayload> outboxItemFactory = null,
            int distributedMutexAcquisitionTimeoutSeconds = Defaults.DistributedMutexAcquisitionTimeoutSeconds
            )
        {
            SqlTransaction = sqlTransaction ??
                             throw new ArgumentNullException(nameof(sqlTransaction), "A valid SqlTransaction must be provided for Sql Transactional Outbox processing.");

            SqlConnection = sqlTransaction.Connection ??
                            throw new ArgumentNullException(nameof(SqlConnection), "The SqlTransaction specified must have a valid SqlConnection.");

            base.Init(
                outboxTableConfig: outboxTableConfig.AssertNotNull(nameof(outboxTableConfig)),
                outboxItemFactory: outboxItemFactory.AssertNotNull(nameof(outboxItemFactory)),
                distributedMutexAcquisitionTimeoutSeconds
                );
        }
 public SqlServerTransactionalOutboxQueryBuilder(ISqlTransactionalOutboxTableConfig outboxTableConfig)
 {
     this.OutboxTableConfig = outboxTableConfig ?? new OutboxTableConfig();
 }