/ / Autofac rejestruje ten sam interfejs z różnymi konstruktorami - c #, autofac, konfiguracja autofac

Autofac rejestruje ten sam interfejs z różnymi konstruktorami - c #, autofac, autofac-configuration

Korzystam z najnowszej wersji Autofac i chciałbym dwukrotnie zarejestrować ten sam typ i interfejs w oparciu o różne konstruktory

Moja klasa / interfejs

public partial class MyDbContext : System.Data.Entity.DbContext, IMyDbContext
{
public MyDbContext(string connectionString)
: base(connectionString)
{
InitializePartial();
}
public MyDbContext(string connectionString, bool proxyCreationEnabled, bool lazyLoadingEnabled, bool autoDetectChangesEnabled)
: base(connectionString)
{
this.Configuration.ProxyCreationEnabled = proxyCreationEnabled;
this.Configuration.LazyLoadingEnabled = lazyLoadingEnabled;
this.Configuration.AutoDetectChangesEnabled = autoDetectChangesEnabled;


InitializePartial();
}

}

W mojej konfiguracji autofac rejestruję się za pośrednictwem ..

        builder.RegisterType<MyDbContext>().As<IMyDbContext>()
.WithParameter((pi, c) => pi.Name == "connectionString", (pi, c) => c.Resolve<IConnectionStringProvider>().ConnectionString)
.InstancePerLifetimeScope();

Jak zarejestrować 2. konstruktor za pomocąAutofac, dzięki czemu mogę go używać przez wstrzyknięcie konstruktora do różnych klas? Zastanawiałem się nad tym, ale w jaki sposób Autofac wie, którą klasę wprowadzić.

        //builder.RegisterType<MyDbContext>().As<IMyDbContext>()
//    .WithParameter((pi, c) => pi.Name == "connectionString", (pi, c) => c.Resolve<IConnectionStringProvider>().ConnectionString)
//    .WithParameter((pi, c) => pi.Name == "proxyCreationEnabled", (pi, c) => false)
//    .WithParameter((pi, c) => pi.Name == "lazyLoadingEnabled", (pi, c) => false)
//    .WithParameter((pi, c) => pi.Name == "autoDetectChangesEnabled", (pi, c) => false)
//    .Named<MyDbContext>("MyDbContextReadOnly")
//    .InstancePerLifetimeScope();

Odpowiedzi:

0 dla odpowiedzi № 1

Wydaje się, że to działa, ale nie jestem pewien, czy to możliwe. Utworzyłem nowy interfejs IMyDbContextReadonly dla klasy MyDbContextReadonly, który ma konstruktor, którego chcę użyć.

    public interface IMyDbContextReadonly : IMyDbContext { }

public class MyDbContextReadonly : MyDbContext, IMyDbContextReadonly
{
public MyDbContextReadonly(string connectionString, bool proxyCreationEnabled, bool lazyLoadingEnabled, bool autoDetectChangesEnabled)
: base(connectionString)
{
this.Configuration.ProxyCreationEnabled = proxyCreationEnabled;
this.Configuration.LazyLoadingEnabled = lazyLoadingEnabled;
this.Configuration.AutoDetectChangesEnabled = autoDetectChangesEnabled;
}
}

Następnie w konfiguracji Autofac zarejestrowałem się jak ..

            builder.RegisterType<MyDbContextReadonly>().As<IMyDbContextReadonly>()
.WithParameter((pi, c) => pi.Name == "connectionString", (pi, c) => c.Resolve<IConnectionStringProvider>().ConnectionString)
.WithParameter("proxyCreationEnabled", false)
.WithParameter("lazyLoadingEnabled", false)
.WithParameter("autoDetectChangesEnabled", false)
.InstancePerLifetimeScope();

To działa, ale czy to prawidłowe podejście? dzięki