Tag: inversion of control

使用Unity IoC进行MVC集成测试

在使用基于构造函数的DI之后,我正在尝试使用Unity IoC。 问题是试图让集成测试工作。 http://patrick.lioi.net/2013/06/20/streamlined-integration-tests/ “运行集成测试应尽可能多地运用真实系统” 上面的Patrick描述了在MVCunit testing项目中设置IoC ..但我仍然坚持如何实现 public class HomeController : Controller { readonly IWinterDb db; // Unity knows that if IWinterDb interface is asked for, it will inject in a new WinterDb() public HomeController(IWinterDb db) { this.db = db; } public ActionResult Index() { var stories = db.Query() .OrderByDescending(s => s.Rating) .Include(s => […]

如何重置IOC容器中的所有实例

我使用MVVM Light框架制作了一个C#WPF应用程序。 我的应用程序使用ViewModelLocator类在运行时定位视图模型。 ViewModelLocator使用了与MVVM Light框架一起提供的SimpleIoc类。 这是我的场景:用户登录可以使用我的应用程序。 在注销时,我想处置/重置/重新创建所有viewmodel实例,以便为下一个用户提供干净的环境。 我试图在ViewModelLocator类中实现Cleanup()方法,但它无法正常工作。 不工作意味着(第二个)用户看到之前登录的用户的数据。 第一次尝试: public static void Cleanup() { SimpleIoc.Default.Reset(); } 第二次尝试: public static void Cleanup() { SimpleIoc.Default.Unregister(); SimpleIoc.Default.Unregister(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); } 第三次尝试(不是我想要的,但它是一种解决方法): public static void Cleanup() { // I implemented the ICleanup interface in my viewmodels // The cleanup method clears all my variables eg: myCollection.clear(); SimpleIoc.Default.GetInstance().Cleanup(); SimpleIoc.Default.GetInstance().Cleanup(); […]

IoC:如何动态创建对象

我有一个问题需要了解如何在需要动态创建对象的场景中使用IoC。 让我们假设我有这个类: abstract class Field { public Field( ICommandStack commandStack ) {} } abstract class Entity { public readonly Collection Fields { get; } } class EntityA { public EntityA( ICommandStack commandStack ) { Fields.Add( new StringField( commandStack ) ); } } class EntitiyB { public EntityB( ICommandStack commandStack ) { Fields.Add( new IntField( commandStack […]

MassTransit和Simple Injector

我正在审查.NET的MassTransit分布式应用程序框架 。 根据网站MassTransit从一开始就建立了IoC容器的概念,并为少数更“主流”的IoC容器提供支持库。 (目前)有Nuofet包可用于Autofac,StructureMap,Castle Windsor,Ninject和Unity。 出于性能原因 ,我选择了Simple Injector作为我选择的IoC容器,但是我无法找到一个集成库,它将对Simple Injector的支持添加到MassTransit。 有没有人试过这个,让它工作,并有一些代码可以让我开始?

如何使用Unity的名称动态注册generics类?

我有一个包含很多类(300+)和BaseClass的程序集,我希望注册一个带接口的generics类。 如果要解析接口的对象数组,则必须通过{ Name }注册。 我想自动在MainViewModel中有一个对象数组。 有没有办法用reflection自动化这个? 有什么建议? 示例(伪): public class BaseClass { public void doFoo(); } public ClassNumber001 : BaseClass { } public ClassNumber002 : BaseClass { } public interface ISuperman { } public class Superman : ISuperman where T : BaseClass { } public MainViewModel(IEnumerable lotsofSuperman) { } 手工实例: container.RegisterType<ISuperman, Superman >(“ClassNumber001”); container.RegisterType<ISuperman, Superman […]

简单的注入器从命名空间注册所有服务

我的服务接口具有Services.Interfaces的命名空间 Service Interfaces的实现具有Web.UI.Services的命名空间 例如,我有2个服务实现 需要注册到UserService的IUserService ICountryService需要注册到CountryService 这就是我目前使用SimpleInjector注册这些服务的方法。 container.Register (); container.Register (); 问题:如果我有超过100个服务夸大了一点。 我需要为每项服务添加一行。 如何使用Simple Injector将所有实现从一个程序集注册到所有接口形成另一个程序集?

为什么CastleWindsor的BeginScope超出范围?

我正在尝试将Castle Windsor添加到我的Web API项目中,并且正在关注此post ,但是在这行代码中遇到编译时错误: this._scope = container.BeginScope(); …作为“ ‘Castle.Windsor.IWindsorContainer’不包含’BeginScope’的定义,并且没有扩展方法’BeginScope’接受类型’Castle.Windsor.IWindsorContainer’的第一个参数可以找到(你是否错过了使用指令或汇编参考?) “ 这是整个代码,因此可以在上下文中看到: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http.Dependencies; using Castle.Windsor; using Castle.MicroKernel.Registration; using System.Web.Http; namespace PlatypiPieServer { public class WindsorDependencyResolver : IDependencyResolver { private readonly IWindsorContainer _container; public WindsorDependencyResolver(IWindsorContainer container) { _container = container; } public IDependencyScope BeginScope() { return new WindsorDependencyScope(_container); […]

使用Castle Windsor指定组件注册实例

我有一个关于Castle Windsor的简单问题,我很久没有使用过了。 我正在尝试使用特定实例注册服务,该实例将是服务的单例实现。 容器无法尝试创建服务本身的实现,因为它具有容器无法解析的依赖项。 我有一个服务实例,我希望它是唯一一个用于请求服务的人的实例。 但我似乎很少运气。 我暂时通过使用这段代码获得了希望: container.Register(Component.For().Instance(serviceObj)); 但是所有Castle都使用实例在其上执行.GetType()并注册该类型。 对服务的请求将随后导致容器尝试创建该类型,并在无法填充依赖项时失败。 那么有什么方法可以做我想做的事情吗? 如果不是,我将创建某种IServiceProvider来获取服务的实例,并且没有容器的依赖关系来填写。 但这比正确的解决方案更像是一种解决方案。 有什么建议? 谢谢!

StructureMap通过注入而不是服务位置来解析依赖性

在我的项目中,我使用汇编扫描程序注册了许多ISerializers实现。 FWIW这是注册我的ISerializers的代码 Scan(scanner => { scanner.AssemblyContainingType(); scanner.AddAllTypesOf().NameBy(type => type.Name); scanner.WithDefaultConventions(); }); 然后正确注册 ISerializer (…ISerializer) Scoped as: Transient JsonSerializer Configured Instance of …JsonSerializer BsonSerializer Configured Instance of …BsonSerializer 等等。 目前,我能够弄清楚如何解决我想要的串行器的唯一方法是使用硬编码服务位置调用 jsonSerializer = ObjectFactory.GetNamedInstance(“JsonSerializer”); 现在我在class上知道我特别想要jsonSerializer,所以有没有办法配置一个规则或类似的东西,说ISerializer根据属性名连接命名实例? 所以我可以 MySomeClass(ISerializer jsonSerializer, ….) StructureMap正确解决了这种情况? 或者我正在接近这个错误,也许我应该只注册实现ISerializer的具体类型,然后专门使用 MySomeClass(JsonSerializer jsonSerializer, ….) 对于具体类的这些方面的东西?

Unity不使用类的默认构造函数

我有这堂课: public class Repo { public Repo() : this(ConfigurationManager.AppSettings[“identity”], ConfigurationManager.AppSettings[“password”]) { } public Repo(string identity,string password) { //Initialize properties. } } 我在web.config中添加了一行,以便Unity容器自动构建此类型。 但在执行我的应用程序期间,我收到此错误消息: “System.InvalidOperationException : the parameter identity could not be resolved when attempting to call constructor Repo(String identity, String password) –>Microsoft.Practices.ObjectBuilder2.BuildFailedException : The current Build operation ….” 1)为什么Unity不使用默认构造函数? 2)假设我希望Unity使用第二个构造函数(参数构造函数),如何通过配置文件将该信息传递给Unity?