标签: simple-injector

SimpleInjector Unbind/Rebind

我有一套核心库,可以"开箱即用"交付和工作.这意味着服务都在内部连线.我希望能够修改核心库(无需修改库本身).

话虽如此,SimpleInjector中是否有Unbind/Rebind支持?我没有在容器上看到任何公开可见的方法.我找到了一个私人的注册词典,我可以通过反思来获得.

有没有人看到我无法在运行时使用反射从这个私人字典中删除项目(然后重新添加)的原因?有缺点的方法吗?

.net c# dependency-injection simple-injector

7
推荐指数
1
解决办法
1656
查看次数

单位测试对象,其生命周期范围由IoC容器处理

我正在使用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 …

c# unit-testing dependency-injection simple-injector membus

7
推荐指数
2
解决办法
1719
查看次数

使用Simple Injector注入MVC​​ Controller Constructor时未注册参数

我有一个非常基本的问题,使用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

7
推荐指数
1
解决办法
8044
查看次数

简单注入器 - 使用相同泛型类型的另一个依赖项注册装饰器

我想我在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)

.net c# generics dependency-injection simple-injector

7
推荐指数
1
解决办法
4605
查看次数

System.Web.Mvc.FilterProviderCollection.GetFilters中的NullReferenceException

我有一个在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)

c# asp.net-mvc simple-injector

7
推荐指数
1
解决办法
1351
查看次数

在OWIN中使用带有WebApi Self Hosted的Simple Injector时,为什么会出现此ActivationException?

我有一个非常简单的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

7
推荐指数
1
解决办法
2351
查看次数

container.RegisterWebApiControllers(GlobalConfiguration.Configuration)导致InvalidOperationException

在我的集成测试中,我使用的是我正在测试的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)

评论后,一切正常,网络应用程序本身和测试. …

c# dependency-injection simple-injector asp.net-web-api

7
推荐指数
1
解决办法
3035
查看次数

SignalR hub中的简单Injector per-web-api-request依赖

根据这篇文章,应该可以将每个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)

.net c# simple-injector signalr asp.net-web-api

7
推荐指数
1
解决办法
2532
查看次数

简单的注射器诊断警告一次性瞬态

我正在尝试配置简单的注入器工作,但我似乎无法通过这个.我按照说明如何在此链接中修复此问题,但它不起作用.这是错误消息:

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生成的,所以它应该已经实现了,对吗?

c# dependency-injection simple-injector

7
推荐指数
1
解决办法
4923
查看次数

使用Simple Injector和.Net Core注册DB Context

嗨,我正在使用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

c# simple-injector entity-framework-core asp.net-core

7
推荐指数
1
解决办法
6621
查看次数