我是DI和IoC的新手,我正在尝试决定学习哪个IoC容器.我已经看到了几个性能比较,其中引用的三个容器似乎表现得非常好.但是,我没有找到包含Hiro或Simple Injector的功能比较.Autofac的社区似乎是最大的,但Hiro和Simple Injector在基准测试中非常快,而Simple Injector尤其声称非常容易学习.也就是说,我不想学习一个并且必须切换到另一个因为功能集有限.出于这个原因,我倾向于Autofac,因为它相当成熟,功能齐全(这里和这里的好文章),也是最快的IoC容器之一.有没有人对这三个容器中至少有两个有过经验?你能提供任何功能比较吗?
.net dependency-injection inversion-of-control autofac simple-injector
我试图用Simple Injector做一些基本的构造函数DI,似乎它无法解析Web API控制器的依赖关系.
SimpleInjectorWebApiDependencyResolver文档的基础,这也是在这里找到的.这似乎不是问题,但我仍然收到以下错误:
类型"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) 目前我正在使用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) 我有一个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
我认为使用我自己的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) Simple Injector允许您在解析时将参数传递给构造函数吗?我想知道这两个框架是否都可以执行Unity的ResolverOverride或DependencyOverride.
我是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对象需要引用另一个对象,该怎么办?
我是Simple Injector IOC容器的新手.我将开始在一个项目中工作,该项目需要使用MVC 4 ASP.NET Web API的多租户ASP.NET MVC实现.
我的问题是:Simple injector支持MVC 4 ASP.NET Web API吗?喜欢读简单的注射器文档这使得引用MVC 3,我想知道,如果MVC 4还支持.
我有一个子类 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) 新的依赖注入,所以这可能是一个简单的问题,但我已经尝试过,无法弄清楚,我正在使用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) simple-injector ×10
c# ×7
.net ×3
asp.net ×1
asp.net-mvc ×1
async-await ×1
autofac ×1
decorator ×1
quartz.net ×1
signalr ×1