我有一套核心库,可以"开箱即用"交付和工作.这意味着服务都在内部连线.我希望能够修改核心库(无需修改库本身).
话虽如此,SimpleInjector中是否有Unbind/Rebind支持?我没有在容器上看到任何公开可见的方法.我找到了一个私人的注册词典,我可以通过反思来获得.
有没有人看到我无法在运行时使用反射从这个私人字典中删除项目(然后重新添加)的原因?有缺点的方法吗?
我正在使用Microsoft Unit Test并具有以下内容:
public class AccountCommandHandlers :
Handler<CreateAccountCommand>,
Handler<CloseAccountCommand>
{
public bool CreateAccountCommandWasCalled = false;
public bool CloseAccountCommandWasCalled = false;
public void Handle(CreateAccountCommand command)
{
CreateAccountCommandWasCalled = true;
}
public void Handle(CloseAccountCommand command)
{
CloseAccountCommandWasCalled = true;
}
}
[TestMethod]
public void CanRaiseInternalHandlers()
{
var iocContainer = SimpleInjectorWiringForMembus.Instance;
iocContainer.Bootstrap(
AppDomain.CurrentDomain.GetAssemblies());
var membus = MembusWiring.Instance;
membus.Bootstrap();
membus.Bus.Publish(new CreateAccountCommand() { Id = 100 });
membus.Bus.Publish(new CloseAccountCommand() { Id = 100 });
}
Run Code Online (Sandbox Code Playgroud)
我正在使用IoC容器(Simple Injector)来处理对象的生命周期范围.Membus将命令连接到命令处理程序,并通过IoC容器解析.
上面的代码运行并运行,命令处理程序将其局部变量设置为true.
但是,由于Simple Injector处理生命周期范围,我无法向Simple Injector请求一个AccountCommandHandler对象,因为它会返回一个CreateAccountCommandWasCalled设置为false …
我有一个非常基本的问题,使用Simple Injector将依赖项注入MVC控制器.我以前使用过SimpleMap的Simple Injector.
MVC的版本是4.5,它是从NuGet安装的Simple Injector的最新版本.
查看HomeController的/ Index视图时出现的错误是:
HomeController类型的构造函数包含IContext类型的参数,其名称为"context",未注册.请确保IContext已在容器中注册,或更改HomeController的构造函数.
控制器如下:
public class HomeController : Controller
{
public HomeController(IContext context) { }
public ActionResult Index() { }
}
Run Code Online (Sandbox Code Playgroud)
IContext只是一个简单的界面:
public interface IContext
{
}
Run Code Online (Sandbox Code Playgroud)
具体的IContext实现也很简单,只是常规DbContext的包装器.
public class DbContext : System.Data.Entity.DbContext, IContext
{
}
Run Code Online (Sandbox Code Playgroud)
有关信息,IContext接口与DbContext实现位于不同的VS Project/Assembly中.这些由MVC项目引用.
我在Global.asax.cs中有以下内容:
protected void Application_Start()
{
var container = new Container();
container.Register<IContext, DbContext>();
container.RegisterMvcControllers(System.Reflection.Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
// Regular MVC startup
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
[ActivationException: The constructor of the type HomeController contains the …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc dependency-injection simple-injector asp.net-mvc-4
我想我在Simple Injector中偶然发现了一个怪癖RegisterDecorator().它甚至出现在最近的2.5.0中.我有一种情况,我想装饰一个封闭的泛型类型,例如ICommandHandler<MessageCommand>,装饰器(通过构造函数注入)一个类型的内部处理程序ICommandHandler<MessageCommand>,但也有另一种类型的处理程序ICommandHandler<LogCommand>.尽管这些命令处理程序类型是不同的,但是当我调用RegisterDecorator这样的装饰器类型时,SimpleInjector似乎会混淆并引发异常:
ArgumentException:为了使容器能够使用MessageLogger作为装饰器,其构造函数必须包含一个类型
ICommandHandler<MessageCommand>(或Func<ICommandHandler<MessageCommand>>)的参数- 即正在装饰的实例的类型.ICommandHandler<MessageCommand>在MessageLogger类的构造函数中多次定义参数类型.
...即使装饰者显然只有一个ICommandHandler<MessageCommand>参数.
以下是抛出异常的完整工作示例:
public interface ICommandHandler<T>
{
void Execute(T command);
}
public class LogCommand
{
public string LogMessage { get; set; }
public DateTime Time { get; set; }
}
public class Logger : ICommandHandler<LogCommand>
{
public void Execute(LogCommand command)
{
Debug.WriteLine(string.Format("Message \"{0}\" sent at {1}",
command.LogMessage, command.Time));
}
}
public class MessageCommand
{
public string Message { get; …Run Code Online (Sandbox Code Playgroud) 我有一个在Windows 2008 R2(IIS 7.5)上运行的MVC 5应用程序(.NET 4.5.1)
运行负载测试时,会定期抛出以下异常.不幸的是,我无法在本地重现并且相当困难,所以我希望社区可以有更多的想法.(更新:现在能够在负载下重现)
查看FilterProviderCollection.GetFilters的源代码表明它可能是依赖项解析器 - 但是没有更多信息,我不愿意简单地替换库.目前它使用的是SimpleInjector.
如果是这种情况,我的猜测是由应用程序池回收引起的,但是无法确认这一点(在应用程序池中启用回收的所有原因的记录没有给我带来任何帮助)
经过多次搜索,我确实找到了一些可能是Glimpse的引用.我已经证实情况并非如此.我还剥离并重建了这个项目,以帮助人们获得信心,不仅仅是nuget-package升级怪异.
任何关于可能导致它的建议,或者我如何添加额外的日志以获取更多信息的任何建议将不胜感激.谢谢.
Exception information:
Exception type: NullReferenceException
Exception message: Object reference not set to an instance of an object.
at System.Web.Mvc.FilterProviderCollection.GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
at System.Web.Mvc.ControllerActionInvoker.GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state)
at System.Web.Mvc.Controller.<BeginExecuteCore>b__1c(AsyncCallback asyncCallback, Object asyncState, ExecuteCoreState innerState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.Async.AsyncResultWrapper.Begin[TState](AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的Web Api v2.2自我托管在OWIN
public class StartUp
{
public void Configuration(IAppBuilder appBuilder, IConfigReader configReader)
{
var container = new Container();
container.Register<IConfigReader, ConfigReader>();
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
appBuilder.UseWebApi(config);
}
}
Run Code Online (Sandbox Code Playgroud)
当我然后使用我Main()的:
WebApp.Start(baseAddress, appBuilder =>
new StartUp().Configuration(appBuilder, new ConfigReader()));
Run Code Online (Sandbox Code Playgroud)
但是当我尝试执行最后一行时,appBuilder.UseWebApi(config);我得到以下异常:
SimpleInjector.dll中发生了'SimpleInjector.ActivationException'类型的第一次机会异常
附加信息:给定类型IHostBufferPolicySelector不是具体类型.请使用其他一个重载来注册此类型.
完整堆栈:
发生SimpleInjector.ActivationException _HResult = -2146233088
_message =给定类型IHostBufferPolicySelector不是具体类型.请使用其他一个重载来注册此类型.
HResult = -2146233088 IsTransient = false Message =给定类型IHostBufferPolicySelector不是具体类型.请使用其他一个重载来注册此类型.Source = SimpleInjector
StackTrace:at SimpleInjector.Advanced.DefaultConstructorResolutionBehavior.VerifyTypeIsConcrete(Type …
self-hosting simple-injector asp.net-web-api owin asp.net-web-api2
在我的集成测试中,我使用的是我正在测试的Web API项目中构建的相同的SimpleInjector.Container.
但是组合根类中的这一行:
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
Run Code Online (Sandbox Code Playgroud)
导致异常:
System.TypeInitializationException : The type initializer for 'MyProject.Api.Test.Integration.HttpClientFactory' threw an exception.
---- System.InvalidOperationException : This method cannot be called during the application's pre-start initialization phase.
Result StackTrace:
at MyProject.Api.Test.Integration.HttpClientFactory.Create()
at MyProject.Api.Test.Integration.Controllers.ProductControllerIntegrationTest.<GetProductBarcode_Should_Return_Status_BadRequest_When_Barcode_Is_Empty>d__0.MoveNext() in d:\Projects\My\MyProject.Api.Test.Integration\Controllers\ProductControllerIntegrationTest.cs:line 26
----- Inner Stack Trace -----
at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
at System.Web.Compilation.BuildManager.GetReferencedAssemblies()
at System.Web.Http.WebHost.WebHostAssembliesResolver.System.Web.Http.Dispatcher.IAssembliesResolver.GetAssemblies()
at System.Web.Http.Dispatcher.DefaultHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)
at System.Web.Http.WebHost.WebHostHttpControllerTypeResolver.GetControllerTypes(IAssembliesResolver assembliesResolver)
at SimpleInjector.SimpleInjectorWebApiExtensions.GetControllerTypesFromConfiguration(HttpConfiguration configuration)
at SimpleInjector.SimpleInjectorWebApiExtensions.RegisterWebApiControllers(Container container, HttpConfiguration configuration)
at MyProject.Api.ContainerConfig.RegisterTypes(Container container) in d:\Projects\My\MyProject.Api\App_Start\ContainerConfig.cs:line 128
at MyProject.Api.ContainerConfig.CreateWebApiContainer() in d:\Projects\My\MyProject.Api\App_Start\ContainerConfig.cs:line 63
at MyProject.Api.Test.Integration.HttpClientFactory..cctor() in d:\Projects\My\MyProject.Api.Test.Integration\HttpClientFactory.cs:line 17
Run Code Online (Sandbox Code Playgroud)
评论后,一切正常,网络应用程序本身和测试. …
根据这篇文章,应该可以将每个Web请求依赖项注入SignalR集线器(尽管有一些限制,如OnDisconnected()方法的问题).在我的例子中,它是ASP Web API(而不是MVC),并且由于某种原因它不起作用.
以下是相关部分:
container.RegisterWebApiControllers(httpConfiguration);
container.RegisterWebApiRequest<DbContext, MyDbContext>();
container.RegisterWebApiRequest<ISampleRepository, SampleRepository>(); //DbContext injected to SampleRepository
//Enable injections to SignalR Hubs
var activator = new SimpleInjectorHubActivator(container);
GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => activator);
Run Code Online (Sandbox Code Playgroud)
这个类可以注入集线器:
public class SimpleInjectorHubActivator : IHubActivator
{
private readonly Container _container;
public SimpleInjectorHubActivator(Container container)
{
_container = container;
}
public IHub Create(HubDescriptor descriptor)
{
return (IHub)_container.GetInstance(descriptor.HubType);
}
}
Run Code Online (Sandbox Code Playgroud)
和Hub本身:
[HubName("sample")]
public class SampleHub : Hub
{
public ActiveBetsHub(ISampleRepository repository)
{
}
//Irrelevant methods here. OnDisconnected() NOT implemented!
}
Run Code Online (Sandbox Code Playgroud)
通过此设置,我得到例外:
No registration …Run Code Online (Sandbox Code Playgroud) 我正在尝试配置简单的注入器工作,但我似乎无法通过这个.我按照说明如何在此链接中修复此问题,但它不起作用.这是错误消息:
NotificationEntities注册为transient,但实现了IDisposable.
这是SimpleInjectorInitializer.cs的代码
public static void Initialize()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IEmailTemplateRepository, EmailTemplateRepository>();
}
Run Code Online (Sandbox Code Playgroud)
NotificationEntities是从EF生成的,所以它应该已经实现了,对吗?
嗨,我正在使用Simple Injector作为我的应用程序DI.我保留了框架DI的默认DI.
但我需要注册DbContextSimpleInjector.当我运行应用程序时
container.Verify()
Run Code Online (Sandbox Code Playgroud)
给出以下错误
ActivationException:UsersDbContext类型的构造函数包含名称为'options'的参数,并键入未注册的DbContextOptions.请确保已注册DbContextOptions,或更改UsersDbContext的构造函数.
我正在函数中使用SimpleInjectore注册DbContext SimpleInjectorConfig.InitializeContainer(app, _container)
// DbContext
container.Register<DbContext, UsersDbContext>();
Run Code Online (Sandbox Code Playgroud)
而我的创业公司就是
public void ConfigureServices(IServiceCollection services)
{
var conString = Configuration.GetConnectionString("DefaultConnection");
// Add framework services.
services.AddDbContext<UsersDbContext>(options => options.UseSqlServer(conString));
services.AddIdentity<User, IdentityRole>()
.AddEntityFrameworkStores<UsersDbContext>()
.AddDefaultTokenProviders();
IdentityConfigurationService.ConfigureIdentityOptions(services);
services.AddMvc();
// Add application services
services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(_container));
services.AddSingleton<IViewComponentActivator>(new SimpleInjectorViewComponentActivator(_container));
services.UseSimpleInjectorAspNetRequestScoping(_container);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
SimpleInjectorConfig.InitializeContainer(app, _container);
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
_container.Verify();
app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)
我知道问题在于选项,但我不知道Simple Injector如何需要注册到容器的默认连接字符串.这可以传递给Simple Injector吗?或者我应该使用DbContextFactory传递连接字符串UserDbContext?
simple-injector ×10
c# ×9
.net ×3
asp.net-mvc ×2
asp.net-core ×1
generics ×1
membus ×1
owin ×1
self-hosting ×1
signalr ×1
unit-testing ×1