【发布时间】:2020-11-17 22:21:41
【问题描述】:
我从 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... 因为我只想显式注册我需要的类。
我的服务是这样构建的:
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;
}
}
这里是命名连接字符串
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
【问题讨论】: