我收到来自Autofac的错误消息;
可以使用可用的服务和参数调用“MyService`1 [MyContext]”类型中的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找到的构造函数: 无法解析构造函数'Void .ctor(MyContext)'的参数'MyContext context'。
此代码行发生错误(也在下面的代码中显示):
IMyService myService = container.Resolve<IMyService>(); // error here
我有兴趣注意,当我在注册中包含这一行时,一切正常:
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
当我注册AnyConcreteType时,这一切都有效......这让我相信我并没有注册一些东西。我的问题是我没有注册什么?出现错误消息,将MyContext命名为罪魁祸首,但显然我正在注册,如下所示 我真的不想使用AnyConcreteType ... catch all,因为我想表达只注册我需要的类。
我的服务是这样构建的:
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; }
}
以下是我如何注册以上内容:
builder.RegisterType<MyService<MyContext>>().As<IMyService>();
builder.RegisterType<NamedConnectionString>().As<INamedConnectionString>().SingleInstance();
builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope();
builder.RegisterType<DbContext>(); // is this necessary??
以下是我的称呼方式:
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
INamedConnectionString namedConnectionString = container.Resolve<INamedConnectionString>();
namedConnectionString.ConnectionString = myConnectionString;
IMyService myService = container.Resolve<IMyService>(); // error here
答案 0 :(得分:3)
Autofac and ASP .Net MVC 4 Web API
以上帖子是相关的。它没有回答这个问题,但它帮助我开始了正确的方向排除故障。解决方案在这里:
我删除了这两行:
builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope();
builder.RegisterType<DbContext>(); // is this necessary??
并将其替换为:
builder.RegisterType<MyContext>().InstancePerLifetimeScope();
答案 1 :(得分:0)
这对我有用
builder.RegisterType()为()InstancePerLifetimeScope();
答案 2 :(得分:0)
使用builder.RegisterType<InventoryContext>().InstancePerLifetimeScope();
完成了这项工作。
上下文:
我有一个DBContext类,我有注入上下文的服务,然后有控制器来调用服务(接口)。
然后在global.asax上称为builder.RegisterType<InventoryContext>().InstancePerLifetimeScope();
。自从我再次与MVC项目合作以来,这一直很有效。
如果有人对此有疑问,可以再次参考。