Вы на самом деле можете зарегистрировать EntityFrameworkSagaRepository<T>
как родовое, но это потребует от вас регистрации DbContext
. Если вы используете SagaDbContext
- у вас не может быть более одной саги в вашем приложении. Единственный способ пойти туда - связать реализацию пользовательского репозитория и SagaDbContext
через общие параметры типа, это то, что делает @slinzerthegod в своем примере.
Вы также можете создать свой собственный контекст, который будет регистрировать все типы. Например:
public class AssemblyScanningSagaDbContext : DbContext
{
readonly Assembly _mappingAssembly;
public AssemblyScanningSagaDbContext(Assembly mappingAssembly, string nameOrConnectionString)
: base(nameOrConnectionString)
{
_mappingAssembly = mappingAssembly;
}
public AssemblyScanningSagaDbContext(Assembly mappingAssembly, ObjectContext objectContext, bool dbContextOwnsObjectContext)
: base(objectContext, dbContextOwnsObjectContext)
{
_mappingAssembly = mappingAssembly;
}
public AssemblyScanningSagaDbContext(Assembly mappingAssembly, DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
_mappingAssembly = mappingAssembly;
}
public AssemblyScanningSagaDbContext(Assembly mappingAssembly, string nameOrConnectionString, DbCompiledModel model)
: base(nameOrConnectionString, model)
{
_mappingAssembly = mappingAssembly;
}
public AssemblyScanningSagaDbContext(Assembly mappingAssembly, DbConnection existingConnection, DbCompiledModel model, bool contextOwnsConnection)
: base(existingConnection, model, contextOwnsConnection)
{
_mappingAssembly = mappingAssembly;
}
protected AssemblyScanningSagaDbContext(Assembly mappingAssembly)
{
_mappingAssembly = mappingAssembly;
}
protected AssemblyScanningSagaDbContext(Assembly mappingAssembly, DbCompiledModel model)
: base(model)
{
_mappingAssembly = mappingAssembly;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder) =>
modelBuilder.Configurations.AddFromAssembly(_mappingAssembly);
}
Если у вас есть такой класс, вы можете сделать следующее:
builder.Register(c => new AssemblyScanningSagaDbContext(typeof(MySagaMapping).Assembly,
connectionString).As<DbContext>();
builder.RegisterGeneric(typeof(EntityFrameworkSagaRepository<>))
.As(typeof(ISagaRepository<>))
.SingleInstance();
builder.RegisterStateMachineSagas(typeof(MySaga).Assembly);
Autofac способен автоматически создавать заводскую делегата и введет его в хранилище конструктора.
Here is the scanning context as gist.
Просто откройте проблему на GitHub, и я исправлю это. –
Добавлено: https://github.com/MassTransit/MassTransit/issues/790 –
Это не проблема документации. Одна регистрация экземпляра/сопоставление/репо является простой, но на самом деле это не тот же уровень обобщения, что и NH. –