Tag: ioc container

按类型名称从StructureMap获取实例

有没有办法通过类型的字符串名称从StructureMap ObjectFactory请求实例? 例如,做这样的事情会很好: var thing = ObjectFactory.GetInstance(“Thing”); 此处的用例是一种消息传递方案,其中消息非常通用,仅包含任务的名称。 处理程序接收消息,从消息中获取任务名称,并从配置数据库中检索关联任务运行器的类型名称。 StructureMap扫描目录中的所有程序集,其中一个(可能)包含从配置数据库返回的类型,然后需要对其进行实例化。 另一种可能性是通过执行以下操作来获取Type实例: var type = Type.GetType(“Thing”); 但问题是可能会或可能/不会在AppDomain中加载程序集,因此并不总是可以进行reflection调用。

StructureMap:创建为瞬态(每个请求)不起作用

我正试图解决一个IoC问题,起初看起来很容易,但结果却是一个痛苦的屁股:-P 我有一个重量级的主类,必须初始化一次,所以它被标记为Singleton。 但是,这个类使用的子类必须为每个请求创建一次,因此它被标记为Transient: public class MyRegistry : Registry { public MyRegistry() { For() .Singleton() .Use(ctx => new MainClass(() => ctx.GetInstance())); For() .Transient() .Use(ctx => CreateNewInstanceOfSubClass()); } private ISubClass CreateNewInstanceOfSubClass() { return new SubClass(); } } public interface ISubClass { } public class SubClass : ISubClass { } public interface IMainClass { } public class MainClass […]

Microsoft Unity – xml代码

有人可以提供我应该与企业库4.1中的Microsoft Unity应用程序块一起使用的XML配置,以实现与以下相同的结果吗? using System; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.InterceptionExtension; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { IUnityContainer container = new UnityContainer(); container.AddNewExtension(); container.RegisterType(); container.Configure().SetInterceptorFor(new InterfaceInterceptor()); var logger = container.Resolve(); logger.Write(“World.”); Console.ReadKey(); } } public interface ILogger { [Test] void Write(string message); } public class Logger : ILogger { public void Write(string message) […]

在structure-map 3中为DecorateAllWith()方法定义filter

我使用以下语句来装饰我的所有ICommandHandlers与Decorator1 : ObjectFactory.Configure(x => { x.For(typeof(ICommandHandler)).DecorateAllWith(typeof(Decorator1)); }); 但是因为Decorator1实现了ICommandHandlers ,所以Decorator1类也会自行修饰。 所以,问题是当我注册所有ICommandHandler时, Decorator1无意中注册。 我怎样才能过滤DecorateWithAll()以装饰除Decorator1之外的所有ICommandHandler Decorator1 ?

LightInject IoC容器在解析类型时抛出stackoverflow

在尝试LightInject IoC容器http://www.lightinject.net/时,它会在解析ISomeService类型时抛出stackoverflowexception: 所有类型都在App_Start中注册: container.RegisterAssembly(“MyApp*.dll”); 然后,当我尝试在控制器中解决它时,它会失败并抛出stackoverflowexception: public SomeController(ISomeService someService) { _someService = someService; } 使用ServiceLocator时也会出现相同的错误: ServiceLocator.Current.GetInstance(); 我已经跟踪了它,我可以看到它在LightInject ServiceContainer类中失败了,但是我不明白为什么它失败了。 public object GetInstance(Type serviceType) { return GetDefaultDelegate(serviceType, true)(constants.Items); } 在调用GetDefaultDelegate之后,执行路径再次在GetInstance中结束,导致无限循环和堆栈溢出。 编辑2 – 已进一步跟踪此问题,它似乎是由SomeService同时具有构造函数和属性注入引起的: public class SomeService : ISomeService { public IAnotherService AnotherService { get; set; } public SomeService(IAnotherService anotherService) { AnotherService = anotherService; } } 依赖IAnotherService AnotherService是通过构造函数和属性注入的,但是无意使用属性注入器。 编辑3 […]

何时在Ninject中取消激活瞬态范围对象?

当Ninject中的对象与InTransientScope()绑定时,该对象不会被放入缓存中,因为它是,呃,是瞬态的,而不是作用于任何东西。 完成对象后,我可以调用kernel.Release(obj) ; 这会传递到Cache,在那里它会检索缓存的项目,并使用缓存的条目调用Pipeline.Deactivate 。 但由于临时对象没有缓存,因此不会发生这种情况。 我无法弄清楚在哪里(或谁)对瞬态对象执行停用。 或者假设瞬态对象只被激活,如果我想要一个可停用的对象,我需要使用其他一些范围?

Ninject 2.0 – 绑定到多次使用相同接口的对象?

考虑以下: public Something(IInterface concreteObjectOne, IInterface concreteObjectTwo) { this.concreteObjectOne = concreteObjectOne; this.concreteObjectTwo = concreteObjectTwo; } 如何设置与Ninject绑定此类绑定? 我试着谷歌搜索这个词,但由于我不知道这叫做什么我不能,也无法在Wiki上找到任何关于此的内容。 编辑 : 我相信这被称为基于约定的绑定,如此处所述。 但是,此文档适用于版本1.0和2.0没有Only方法。 我希望这可以在没有属性的情况下实现 – 使用名称约定或类似的东西。

使用新的WCF Web API设置Ninject

所以我一直在玩最新版本的WCF Web API,并决定用它来实现Ninject。 基于我读过的内容,我需要实现IResourceFactory接口,该接口需要以下方法: public object GetInstance(System.Type serviceType, System.ServiceModel.InstanceContext instanceContext, System.Net.Http.HttpRequestMessage request); public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, object service); 所以我把鸡抓了下面: public class NinjectResourceFactory : IResourceFactory { private readonly IKernel _kernel; public NinjectResourceFactory() { var modules = new INinjectModule[] { new ServiceDIModule(), //Service Layer Module new RepositoryDIModule(), //Repo Layer Module new DataServiceDIModule() }; _kernel = new StandardKernel(modules); […]

Autofac:使用in和out类型参数解析变体类型

这个问题是我之前提出的问题的后续问题: Autofac:隐藏一个复合背后的多个逆变实现 。 我试图找到我们可以用Autofac的协方差和逆变支持做些什么的边界。 我注意到Autofac的ContravariantRegistrationSource仅支持具有使用in关键字标记的单个generics参数的通用接口。 这似乎限制了这个function的实用性,我想知道Autofac是否有其他方法来扩展协方差和逆变的支持。 我必须承认,由于我正在使用的真实应用程序设计,我不是在问这个问题。 为了教育,我故意试图找到Autofac的限制。 请考虑以下界面: public interface IConverter { TOut Convert(TIn value); } 以下实施: public class ObjectToStringConverter : IConverter { string IConverter.Convert(object value) { return value.ToString(); } } 以下注册: var builder = new ContainerBuilder(); builder.RegisterSource(new ContravariantRegistrationSource()); builder.RegisterType() .As<IConverter>(); var container = builder.Build(); 通过这种设计和配置,我希望能够做到这一点: // This call succeeds because IConverter is // […]

注册“半封闭”通用组件

我有两个接口: public interface IQuery { } public interface IQueryHandler where TQuery : IQuery { TResult Handle(TQuery q); } IQueryHandler的封闭实现示例: public class EventBookingsHandler : IQueryHandler<EventBookings, IEnumerable> { private readonly DbContext _context; public EventBookingsHandler(DbContext context) { _context = context; } public IEnumerable Handle(EventBookings q) { return _context.Set() .OfEvent(q.EventId) .AsEnumerable() .Select(EventBooking.FromMemberEvent); } } 我可以使用此组件注册注册并解决IQueryHandler封闭通用实现: Classes.FromAssemblyContaining(typeof(IQueryHandler)) .BasedOn(typeof(IQueryHandler)) .WithServiceAllInterfaces() 但是,我想要做的是解决一个“半封闭”的开放式通用实现(即指定一个通用的TQuery类型参数): […]