2016-09-15 8 views
2

ASP.NET MVCアプリケーションでDbContextをInstancePerRequestとして登録しています。 (IoC AutofacInstancePerRequest DbContext ASP.NET MVC

builder.RegisterType<ADbContext>().As<IADbContext>().InstancePerRequest(); 

BService

public class BService : IBService 
{ 
    readonly IADbContext _dbContext; 
    public BService(IADbContext dbContext) 
    { 
     _dbContext = dbContext; 
    } 
} 

がシングルトンとしてIBServiceを登録しようと内部使用。

builder.RegisterType<BService>().As<IBService>().SingleInstance(); 

明らかに、これは私にTAGマッチとエラー

いいえ範囲を与え「AutofacWebRequest」インスタンスが要求されたスコープから見えます。

最も簡単な解決策は、InstancePerRequestとしてIBServiceを登録することで、むしろ上記のエラーメッセージよりPerRequest IBServiceを有する理由はありません。

シングルトンサービス内でPerRequestDbContextを使用するにはどうすればよいですか?

+1

短い回答:できません。リクエストごとにシングルトンにコンテキストを注入する必要があります。正直なところ、これはコードの臭いのように感じ、多分あなたはあなたの設定を再考する必要がありますか? – DavidG

+0

@DavidG恐らく、ベストプラクティスを提案できますか? – tchelidze

+1

ここではベストプラクティスとは思えませんが、文脈を乱しているとシングルトンはおそらく良い考えではないと思います。コンテキストは可能な限り遅く作成し、できるだけ早く破棄する必要があります。また、それらは並行性をサポートしていないため、2つの要求が同時にそれをヒットしようとすると、いくつかの奇妙なエラーが発生します。 – DavidG

答えて

1

最初にICertainerをBServiceに注入できます。しかし、これはサービスロケータのパターンのように見えますが、それは良くありません。そうでなければ、あなたはそれを実装し、

最後に
public class SimpleFactory<T> : IFactory<T> 
{ 
    private IContainer _container; 

    public SimpleFactory(IContainer container) 
    { 
     _container = container;  
    } 

    public T GetInstance() 
    { 
     return _container.Resolve<T>(); 
    } 
} 

public class DbContextFactory : SimpleFactory<IADbContext> 
{ 
    public DbContextFactory(IContainer container):base(container) 
    { 
    } 
} 

を登録し、

public class BService : IBService 
{ 
    IADbContext _dbContext => _dbContextFactory.GetInstance(); 
    IFactory<IADbContext> _dbContextFactory 

    public BService(IFactory<IADbContext> dbContextFactory) 
    { 
     _dbContextFactory = dbContextFactory; 
    } 
} 

あなたsingletoneであなたにアセスしたいたびに、このファクトリを使用すると

public interface IFactory<T> 
{ 
    T GetInstance(); 
} 

ファクトリインタフェースを定義することができますこの要求をIoCコンテナに渡します。これは要求ごとにコンテキストを返すことができます。

関連する問題