- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我的解决方案中,我有更多的程序集。其中一些包含一个 Autofac 模块,其中包含来自程序集的注册。我在启动后立即将所有注册连接在一起。到目前为止一切正常,我通过构造函数注入(inject)创建了依赖项,Autofac 帮助我解决了依赖项。
(在这个项目中,我在控制台应用程序中托管 SignalR 和 WebApi 功能。我也使用 OWIN。)
在添加 WebApi 并使用 DI 创建我的第一个 Controller 后,我遇到了一个问题。在 MyController
的构造函数中我依赖 MyInterface
.当我尝试在我的 Controller 上调用任何方法时,我得到了普通的
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'MyController' can be invoked with the available services and parameters: Cannot resolve parameter 'MyInterface myInt' of constructor 'Void .ctor(MyInterface)'.
异常。我注意到了什么:
MyInterface
与另一个组件中的另一个一起加载 Controller 。MyInterface
可以在我的代码中的另一个地方解决(在另一个程序集中)我继续进行一些调试。我试图在我的 OWIN 启动类中的启动时解决一些类。我现在看到的是
MyAssembly1
中的任何类型, MyAssembly2
MyAssembly3
中的所有类型, MyAssembly4
container.Resolve<MyInterface>
从代码中抛出异常container.Resolve<MyInterface>
如果我在调试期间通过 Visual Studio 中的监 window 口解析它,则返回已解析的类container.ComponentRegistry.Registrations
中看到所有 注册你能告诉我,我做错了什么吗?
我尽量提供所有必要的信息,请让我知道,如果我仍然忘记了什么。
这是 AssemblyA 中的 Autofac 模块定义
public class AutofacModuleConfig : Module, IAutofacModuleConfig
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<MyWorkingImplementation>().As<IMyWorkingInterface>();
base.Load(builder);
}
这是 AssemblyB 中的 Autofac 模块定义
public class AutofacModuleConfig : Module, IAutofacModuleConfig
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<MyNotWorkingImplementation>().As<IMyNotWorkingInterface>();
base.Load(builder);
}
}
在设置 WebHost 的程序集中有 Controller 的注册(与以前的结构相同)
builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
这就是我在应用程序启动时注册东西的方式
private void RegisterModuleDependencies()
{
var builder = new ContainerBuilder();
builder.RegisterType<Core.Logger.Log4NetLogger>().As<ILogger>();
var moduleConfigs = GetModuleConfigurations();
foreach (var module in moduleConfigs)
builder.RegisterModule(module);
container = builder.Build();
}
private List<Autofac.Module> GetModuleConfigurations()
{
var type = typeof(IAutofacModuleConfig);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p) && p.GetConstructor(Type.EmptyTypes) != null);
return types.Select(t => (Autofac.Module)Activator.CreateInstance(t)).ToList();
}
这是SignalR和WebApi的启动方法
private void Startup(IAppBuilder app)
{
IDependencyResolver resolver = new AutofacDependencyResolver(container);
GlobalHost.DependencyResolver = resolver;
...
ConfigureOAuth(app, resolver.Resolve<IAuthorizationService>());
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR(new HubConfiguration
{
Resolver = resolver,
EnableDetailedErrors = true,
EnableJavaScriptProxies = false
});
//Host WebApi
HttpConfiguration webApiConfiguration = new HttpConfiguration();
webApiConfiguration.MapHttpAttributeRoutes();
webApiConfiguration.Routes.MapHttpRoute("DefaultWebApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });
webApiConfiguration.Services.Add(typeof(System.Web.Http.ExceptionHandling.IExceptionLogger), new WebApiExceptionLogger());
webApiConfiguration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
app.UseWebApi(webApiConfiguration);
}
出于测试目的,我包含了常见示例中使用的 ValuesController。使用默认构造函数,它自然可以正常工作。如果我用 IMyWorkingInterface
添加构造函数然后,正如其名称所暗示的那样,它可以完美运行。但是,如果我将构造函数包含在 IMyNotWorkingInterface
中而不是工作的然后我得到了异常。
public class ValuesController : ApiController
{
//private readonly TestNamespaceInAssemblyB.IMyNotWorkingInterface notWorkingInstance;
//public ValuesController(TestNamespaceInAssemblyB.IMyNotWorkingInterface notWorkingInstance)
//{
// this.notWorkingInstance = notWorkingInstance;
//}
private readonly TestNamespaceInAssemblyA.IMyWorkingInterface workingInstance;
public ValuesController(TestNamespaceInAssemblyA.IMyWorkingInterface workingInstance)
{
this.workingInstance = workingInstance;
}
想在加IMyNotWorkingInterface
的时候再点一下作为另一个程序集(比方说 AssemblyC)的依赖项,然后它会被 Autofac 正确解析。
在调试器中我看到了注册 MyNotWorkingImplementation
在监 window 口中。更重要的是,我什至可以从调试器中解决它,正如您在图像上看到的那样。
我为 Autofac 事件创建了事件处理程序,这里的日志显示了当我尝试注入(inject) IMyNotWorkingInterface
时发生的情况。
2017-01-08 13:32:36.920753 | [0x00002acc] | DEBUG | Core - WebHost | AGENT | Chile lifetime scope started
2017-01-08 13:32:36.934754 | [0x00002acc] | DEBUG | Core - WebHost | AGENT | Resolve operation started
2017-01-08 13:32:36.936754 | [0x00002acc] | DEBUG | Core - WebHost | AGENT | Instance lookup is beginning for Activator = ValuesController (DelegateActivator), Services = [API.Agent.Web.Controllers.ValuesController], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = ExternallyOwned
2017-01-08 13:32:36.938754 | [0x00002acc] | DEBUG | Core - WebHost | AGENT | Instance lookup is beginning for Activator = ValuesController (ReflectionActivator), Services = [API.Agent.Web.Controllers.ValuesController], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = OwnedByLifetimeScope
2017-01-08 13:32:36.939754 | [0x00002acc] | DEBUG | Core - AutofacModuleConfig | AGENT | Resolve for was requested by Activator = ValuesController (ReflectionActivator), Services = [API.Agent.Web.Controllers.ValuesController], Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime, Sharing = None, Ownership = OwnedByLifetimeScope
2017-01-08 13:32:36.966757 | [0x00002acc] | DEBUG | Core - WebHost | AGENT | Resolve operation finished
2017-01-08 13:32:36.967757 | [0x00002acc] | ERROR | Core - WebHost | AGENT |
Autofac.Core.DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'API.Agent.Web.Controllers.ValuesController' can be invoked with the available services and parameters:
Cannot resolve parameter 'TestNamespaceInAssemblyB.IMyNotWorkingInterface notWorkingInstance' of constructor 'Void .ctor(TestNamespaceInAssemblyB.IMyNotWorkingInterface)'.
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Registration.ExternalRegistrySource.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable`1 p)
at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
2017-01-08 13:32:38.085869 | [0x000029c4] | DEBUG | Core - WebHost | AGENT | Child lifetime scope closed
知道在哪里可以将一些调试代码粘贴到 Autofac 中吗? (对了,我用的是Autofac 3.5.2)
最佳答案
确保注册您的 Controller 。您需要为 autofac 包含 WebApi 特定的 nuget 包,并在启动时从您的容器构建器调用以下方法:
RegisterApiControllers(Assembly.GetExecutingAssembly());
关于c# - Autofac 无法在运行时解析来自某些程序集的类型,在调试器中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41505364/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!