0

最新の Autofac を使用しており、異なるコンストラクターに基づいて同じ型とインターフェイスを 2 回登録したいと考えています。

私のクラス/インターフェース

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();
    }

}

私のautofacセットアップでは、..経由で登録しています

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

2番目のコンストラクターをAutofacに登録して、異なるクラスでコンストラクターインジェクションを介して使用できるようにするにはどうすればよいですか? 私は次のようなことを考えていましたが、Autofac はどのクラスを注入するかをどのように認識していますか。

        //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();
4

1 に答える 1

0

これは機能しているように見えますが、可能な限り最善であるとは確信していません。使用したいコンストラクターを持つクラス MyDbContextReadonly の新しい IMyDbContextReadonly インターフェイスを作成しました。

    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;
    }
}

次に、Autofac構成内で、次のように登録しました..

            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();

これは機能しますが、これは正しいアプローチですか? どうも

于 2016-09-20T01:07:03.850 に答える