2016-04-28 4 views
1

を解決することはできません;:タイプの「Autofac.Core.Activators.Reflection.DefaultConstructorFinder」で見つかったコンストラクタのAutofac私はAutofacから、このエラーメッセージを受信して​​いDbContext

なし「MyService`1 [あるMyContext]」になることはできません使用可能なサービスとパラメータで呼び出されます。 コンストラクタ 'Void .ctor(MyContext)'のパラメータ 'MyContext context'を解決できません。私は私が私の登録でこの行を含む場合、すべてが動作することに注意して興味を持って

IMyService myService = container.Resolve<IMyService>(); // error here 

エラーのコード行(また、以下のコードに示されている)で発生し

builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); 

AnyConcreteTypeを登録するとすべてが機能するという事実は、私が何かを登録していないと信じさせてくれます。私の質問は私が何を登録していないのですか?エラーメッセージはMyContextを原因として表示しますが、明らかに私は以下のように登録しています。
AnyConcreteTypeを使用したくないのですが...私が必要とするクラスだけを明示的に登録したいからです。

私のサービスは、このように構成されています

public class MyService<T> : BaseService<T>, IMyService where T:DbContext,IMyContext 
{ 
    public MyService(T context) : base(context) 
    { 
    } 
} 

MyServiceではBaseServiceから派生:

public abstract class BaseService<T> : IDisposable where T:DbContext, IMyContext 
{ 
    internal T db; 

    public BaseService(T context) 
    { 
     db = context; 
    } 
} 

があるMyContextががMyServiceに渡され、このように構成されています

public partial class MyContext : DbContext, IMyContext 
{ 
    public MyContext(INamedConnectionString conn) 
     : base(conn.ConnectionString) 
    { 
     Configuration.ProxyCreationEnabled = false; 
    } 
} 

ここにありますNamedConnectionString

ここで
public class NamedConnectionString : INamedConnectionString 
{ 
    public string ConnectionString { get; set; } 
} 

は、私は上記の登録方法です:

var container = builder.Build(); 
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
    INamedConnectionString namedConnectionString = container.Resolve<INamedConnectionString>(); 
    namedConnectionString.ConnectionString = myConnectionString; 
    IMyService myService = container.Resolve<IMyService>(); // error here 

答えて

2

Autofac and ASP .Net MVC 4 Web API

上記のスレッドが関連している:

builder.RegisterType<MyService<MyContext>>().As<IMyService>(); 
builder.RegisterType<NamedConnectionString>().As<INamedConnectionString>().SingleInstance(); 
builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope(); 
builder.RegisterType<DbContext>(); // is this necessary?? 

そして、ここでは、私はそれを呼び出す方法です。質問には答えませんが、正しい方向にトラブルシューティングを開始するのに役立ちました。解決策はここにある:

が、私はこの2行削除:

builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope(); 
builder.RegisterType<DbContext>(); // is this necessary?? 

をし、この1でそれらを置き換え:これは私のために働いた

builder.RegisterType<MyContext>().InstancePerLifetimeScope(); 
0

builder.RegisterType( ).As()。InstancePerLifetimeScope();