标签: simple-injector

Simple Injector vs Hiro vs Autofac

我是DI和IoC的新手,我正在尝试决定学习哪个IoC容器.我已经看到了几个性能比较,其中引用的三个容器似乎表现得非常好.但是,我没有找到包含Hiro或Simple Injector的功能比较.Autofac的社区似乎是最大的,但Hiro和Simple Injector在基准测试中非常快,而Simple Injector尤其声称非常容易学习.也就是说,我不想学习一个并且必须切换到另一个因为功能集有限.出于这个原因,我倾向于Autofac,因为它相当成熟,功能齐全(这里这里的好文章),也是最快的IoC容器之一.有没有人对这三个容器中至少有两个有过经验?你能提供任何功能比较吗?

.net dependency-injection inversion-of-control autofac simple-injector

44
推荐指数
1
解决办法
2万
查看次数

简单的注入器无法在Web API控制器中注入依赖项

我试图用Simple Injector做一些基本的构造函数DI,似乎它无法解析Web API控制器的依赖关系.

  • 我在"API"文件夹中有一个API控制器,它位于"Controllers"文件夹之外.
  • 我也尝试将它放在"控制器"文件夹中,但这似乎并没有多大区别.我收到的堆栈跟踪与此问题中提供的类似.
  • 我正在使用全新安装的"Simple Injector MVC Integration Quick Start"NuGet Package(v.2.1.0).
  • 我有SimpleInjectorWebApiDependencyResolver文档的基础,这也是在这里找到的.
  • 我正在使用Entity Framework,并查看了有关更改以正确加载上下文的讨论主题.

这似乎不是问题,但我仍然收到以下错误:

类型"MyProject.API.ArticleController"没有默认构造函数

System.ArgumentException at

System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator的System.Web.Http.Internal.TypeActivator.Create [TBase](Type instanceType)中的System.Linq.Expressions.Expression.New(Type type)(HttpRequestMessage请求,类型为controllerType) System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request,HttpControllerDescriptor controllerDescriptor,Type controllerType),Func`1&activator)

如果有人可以提供一些关于是否应该从其当前状态/呼叫顺序修改任何内容的建议,将不胜感激.

ArticleController(基本结构):

public class ArticleController : ApiController
{
    private readonly IArticleRepository articleRepository;
    private readonly IUserRepository userRepository;
    private readonly IReleaseRepository releaseRepository;

    public ArticleController(IArticleRepository articleRepository, IUserRepository userRepository, IReleaseRepository releaseRepository)
    {
        this.articleRepository = articleRepository;
        this.userRepository = userRepository;
        this.releaseRepository = releaseRepository;
    }

    // GET api/Article
    public IEnumerable<Article> GetArticles(){ // …
Run Code Online (Sandbox Code Playgroud)

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

41
推荐指数
1
解决办法
4万
查看次数

使用Quartz.NET和Simple Injector进行构造函数注入

目前我正在使用Quartz.NET编写一个服务来安排它的运行.

我想知道是否有人有任何使用Quartz.NET和Simple Injector构造函数注入的经验.

以下基本上是我希望实现的目标

public class JobImplementation: IJob
{
    private readonly IInjectedClass injectedClass;

    public JobImplementation(IInjectedClass _injectedClass)
    {
         injectedClass = _injectedClass
    }

    public void Execute(IJobExecutionContext _context)
    {
        //Job code
    }
Run Code Online (Sandbox Code Playgroud)

.net c# dependency-injection quartz.net simple-injector

36
推荐指数
1
解决办法
2万
查看次数

避免所有DI反模式需要异步初始化的类型

我有一个Connections需要异步初始化的类型.这种类型的实例被其他几种类型(例如Storage)消耗,每种类型也需要异步初始化(静态,不是每个实例,并且这些初始化也依赖于Connections).最后,我的逻辑类型(例如Logic)使用这些存储实例.目前使用Simple Injector.

我尝试了几种不同的解决方案,但总有一种反模式存在.


显式初始化(​​时间耦合)

我目前使用的解决方案有Temporal Coupling反模式:

public sealed class Connections
{
  Task InitializeAsync();
}

public sealed class Storage : IStorage
{
  public Storage(Connections connections);
  public static Task InitializeAsync(Connections connections);
}

public sealed class Logic
{
  public Logic(IStorage storage);
}

public static class GlobalConfig
{
  public static async Task EnsureInitialized()
  {
    var connections = Container.GetInstance<Connections>();
    await connections.InitializeAsync();
    await Storage.InitializeAsync(connections);
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经将Temporal Coupling封装成一种方法,所以它并没有那么糟糕.但是,它仍然是一个反模式,而不是像我想的那样可维护.


抽象工厂(同步异步)

常见的解决方案是抽象工厂模式.但是,在这种情况下,我们正在处理异步初始化.因此,我可以通过强制初始化同步运行使用抽象工厂,但这会采用同步异步反模式.我真的不喜欢异步同步方法,因为我有几个存储空间,在我当前的代码中,它们都是同时初始化的; 由于这是一个云应用程序,将其更改为串行同步会增加启动时间,并且由于资源消耗,并行同步也不理想.


异步抽象工厂(不正确的抽象工厂用法)

我也可以使用Abstract Factory和异步工厂方法.但是,这种方法存在一个主要问题.正如马克·西曼(Mark …

dependency-injection initialization abstract-factory async-await simple-injector

29
推荐指数
2
解决办法
1484
查看次数

使用SimpleInjector和SignalR

我认为使用我自己的IoC对SignalR非常简单,也许是; 我很可能做错了什么.这是我到目前为止的代码:

private static void InitializeContainer(Container container)
{

   container.Register<IMongoHelper<UserDocument>, MongoHelper<UserDocument>>();
   // ... registrations like about and then:
   var resolver = new SimpleInjectorResolver(container);
   GlobalHost.DependencyResolver = resolver;
}
Run Code Online (Sandbox Code Playgroud)

然后我的班级:

public class SimpleInjectorResolver : DefaultDependencyResolver
{
    private Container _container;
    public SimpleInjectorResolver(Container container)
    {
        _container = container;
    }

    public override object GetService(Type serviceType)
    {
        return _container.GetInstance(serviceType) ?? base.GetService(serviceType);
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType) ?? base.GetServices(serviceType);
    }
}
Run Code Online (Sandbox Code Playgroud)

最终发生的事情是我得到一个IJavaScriptProxyGenerator无法解决的错误,所以我想,我会添加注册:

container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
    ConstructorSelector.MostParameters);
Run Code Online (Sandbox Code Playgroud)

但是还有其他一些人!我到达:

container.Register<IDependencyResolver, SimpleInjectorResolver>();
container.Register<IJavaScriptMinifier, NullJavaScriptMinifier>();
container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
    ConstructorSelector.MostParameters);
container.Register<IHubManager, …
Run Code Online (Sandbox Code Playgroud)

c# simple-injector signalr

27
推荐指数
3
解决办法
1万
查看次数

如何使用Simple Injector将参数传递给构造函数?

Simple Injector允许您在解析时将参数传递给构造函数吗?我想知道这两个框架是否都可以执行Unity的ResolverOverride或DependencyOverride.

inversion-of-control simple-injector

21
推荐指数
3
解决办法
2万
查看次数

简单注入器中的工厂接口

我是Ninject用户,试图学习Simple Injector

我经常在我的应用程序中使用的一个Ninject feture是Factory Interface

有了它,我可以创建一个这样的接口:

public interface IBarFactory
{
   Bar CreateBar();
}
Run Code Online (Sandbox Code Playgroud)

并注册就像这样

kernel.Bind<IBarFactory>().ToFactory();
Run Code Online (Sandbox Code Playgroud)

然后我简单可以使用IBarFactory,而不必创建IBarFactory的实现

我现在尝试在Simple njector中找到类似的东西,并找到了这个.但是随着那个接近,我必须实现工厂接口(更多代码).如果Bar对象需要引用另一个对象,该怎么办?

c# dependency-injection simple-injector

18
推荐指数
1
解决办法
7686
查看次数

Simple Injector是否支持MVC 4 ASP.NET Web API?

我是Simple Injector IOC容器的新手.我将开始在一个项目中工作,该项目需要使用MVC 4 ASP.NET Web API的多租户ASP.NET MVC实现.

我的问题是:Simple injector支持MVC 4 ASP.NET Web API吗?喜欢读简单的注射器文档使得引用MVC 3,我想知道,如果MVC 4还支持.

.net c# ioc-container simple-injector

17
推荐指数
1
解决办法
6492
查看次数

装饰者和IDisposable

我有一个子类 DbContext

public class MyContext : DbContext { }
Run Code Online (Sandbox Code Playgroud)

并且我对该实现有一个IUnitOfWork抽象MyContext,IDisposable以确保MyContext在适当的时间处理诸如的引用

public interface IUnitOfWork : IDisposable { }

public class UnitOfWork : IUnitOfWork 
{
    private readonly MyContext _context;

    public UnitOfWork()
    {
        _context = new MyContext();
    }

    ~UnitOfWork()
    {
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private bool _disposed;

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed) return;

        if (disposing)
        {
            if (_context != null) _context.Dispose();
        }

        _disposed = true;
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# decorator ioc-container simple-injector

17
推荐指数
2
解决办法
1594
查看次数

依赖注入(使用SimpleInjector)和OAuthAuthorizationServerProvider

新的依赖注入,所以这可能是一个简单的问题,但我已经尝试过,无法弄清楚,我正在使用Simple Injector.

我有一个完全使用SimpleInjector的WebApi,现在我想使用OAuth实现安全性.

为此,我开始学习本教程,这非常有用,但不使用Dependancy Injection

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

我的global.asax文件看起来像这样,设置依赖注入(完美工作)

protected void Application_Start()
{
    SimpleInjectorConfig.Register();

    GlobalConfiguration.Configure(WebApiConfig.Register);
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个Startup.Auth.cs文件来配置OAuth

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new MyAuthorizationServerProvider() // here is the problem
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我在上面评论过,MyAuthorizationServerProvider就是问题所在.它需要我通常注入的IUserService参数.我不想清空构造函数,因为我的IUserService也注入了一个存储库.这是文件

public class ApiAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    private IUserService _service;
    public ApiAuthorizationServerProvider (IUserService service) 
    {
         _service = service;
    }

    public override async …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc dependency-injection simple-injector

17
推荐指数
3
解决办法
7118
查看次数