Tag: ioc container

如何在SimpleIOC中注册包含参数的类实例

我需要创建一个ViewModel实例,并在创建时将特定参数传递给ViewModel。 同时,此ViewModel实例应在SimpleIOC中注册 我认为这是它的方法: SimpleIoc.Register Method (Func, String, Boolean) 对于即时创建的最后一个参数,设置为true 。 因此,如果我理解正确,此方法需要引用将创建我的ViewModel实例的方法。 这看起来像一个ClassFactory。 我试着自己做,但我得到的只是 cannot convert from to System.Func 所以它似乎总是传递类的实例,而不是应该创建它的方法。 有人能给出一个简短的例子,说明我是如何让这个工作的 public class ClassFactory { public ChatWindow CreateChatWindow(RosterItemX ri) { return new ChatWindow(ri); } } public class ViewModelLocator { . . . . public static void CreateWindow(RosterItemX riv) { ClassFactory cf = new ClassFactory; SimpleIoc.Default.Register(cf.CreateChatWindow(ri), “key”, […]

使用IoC链接层,将较低的回调设置为较高并避免循环引用

我有一个场景,我需要一个较低层由上层控制,就像一个木偶大师拉弦。 由于一些内部事件不时生成,因此下层也将回调上层。 我正在使用SimpleInjector,我将ILower注入到Upper构造函数中。 我不能将Upper注入Lower,因为它会导致循环引用。 相反,我有一个寄存器回调函数来链接这两个层。 但是,我必须使用空检查分散我的代码。 有没有更好的方法或不同的架构来实现这种对象的链接? // an interface that transport can callback from transport to client public interface ILowerToUpperCallback { void ReplyA(); void ReplyB(); } // transport interface that client calls public interface ILower { void Test1(); void Test2(); void RegisterCallback(ILowerToUpperCallback callback); } public class Upper : ILowerToUpperCallback { private readonly ILower lower; […]

使用Windsor的通用存储库生存期配置

我没有想法如何配置正确的Windsor容器以与Windows应用程序中的存储库一起使用。 我有通用存储库实现Repository,其中T是实体类型,它有一个依赖IDatacontextProvider,它为它提供datacontext: public class Repository : IRepository where T : class { protected DataContext DataContext; public Repository(IDataContextProvider dataContextProvider) { DataContext = dataContextProvider.DataContext; } …. } 对于简单的事情,以下配置一切正常: container.Register( Component.For() .ImplementedBy() .Lifestyle.Transient, Component.For(typeof(IRepository)) .ImplementedBy(typeof(Repository)) .Lifestyle.Transient, …. 当我尝试从多个存储库加入不同的实体时,只要每个存储库实例具有不同的数据上下文实例,就会出现问题。 例如,我有简单的服务: public class SimpleService : ISimpleService { public SimpleService(IRepository, IRepository) { …. } } 我可以将IDataContextProvider设为Singleton,但我认为这会带来更大的问题。 我可以将IDataContextProvider传递给SimpleService,并尝试在那里解析存储库实例,但这需要额外的代码才能使服务易于测试,并且需要额外的依赖性。 可能有人有更好的想法如何解决这个问题? 更新:以下建议,我已经创建了存储库工厂(它与提出的答案有点不同,它没有直接依赖于datacontext,但想法非常相似): public interface […]

多个RegisterAll注册使用与SimpleInjector相同的单例集

我正在使用Simple Injector为电子商务项目构建一个插件系统。 我正在使用RegisterAll来注册IPaymentProvider和IResourceRegistrar所有实现(以及更多)。 但这每次都会创建一个新实例。 建议在每种类型上使用RegisterSingle 。 但是在这种情况下如何实现这一目标呢? private static void RegisterMultipleUnderOneInterface( Container container, string name) { IEnumerable pluginRegistrations = from dll in finder.Assemblies from type in dll.GetExportedTypes() where type.GetInterfaces().Any(i => i.Name == name) where !type.IsAbstract where !type.IsGenericTypeDefinition select type; if (pluginRegistrations.Any()) { var @interface = pluginRegistrations.ElementAt(0).GetInterfaces() .First(i => i.Name == name); foreach (Type type in […]

如何在Unity中使用不同的构造函数两次注册相同的类型?

我正在尝试注册相同的类型,但有两个不同的构造函数。 当我尝试解决时,我在第二个Resolve上得到“ 依赖失败的解决方案”。 var container = new UnityContainer(); container.RegisterType() .RegisterInstance(new Bar()) .RegisterType() .RegisterInstance(new Bar(“foo”)); Bar bar1 = (Bar)container.Resolve(); Bar bar2 = (Bar)container.Resolve(“foo”); // ERROR 我做错了什么?

为参数的具体名称注册字符串值

我正在使用Autofac,我有几个类要求参数类型字符串和名称lang。 有没有办法将字符串值注册到名为“lang”的所有参数,所以它会自动解决? 我不想编辑任何构造函数,因为它不是我的代码(我知道接受例如CultureInfo会使注册变得容易..) 导致语法简短的东西,比如builder.Register(lang =>“en-US”)。As()。Named(“lang”) 会是理想的。 谢谢。

带有Ninject的AutoMapper

我一直在尝试设置AutoMapper来通过Ninject实例化所有对象。 我在global.asax文件中有以下代码 Mapper.Configuration.ConstructServicesUsing(x => kernel.Get(x)); 作为一个例子,我有以下映射 Mapper.CreateMap(); 但是,这似乎不起作用。 我得到一个’IndexViewModel’没有默认构造函数的错误。 我可以通过显式告诉automapper在映射中使用ninject来使映射器工作。 Mapper.CreateMap().ConstructUsingServiceLocator(); 但是,我宁愿不必为每个映射执行此操作。 我错过了什么吗?

在Unity配置中,如何将connectionString传递给构造函数?

我在web.config中设置统一配置,我有一个类型,我想传递给它的连接字符串已经存在于同一个web.config文件中。 在统一部分有: 但是就像我在同一个.config文件中写两次相同的conectionString一样,是否有另一种更好的方法将connectionString的名称传递给类型数据库构造函数以避免web.config中的重复?

如何将此服务定位器模式转换为真正的dependency injection模式?

我在一分钟前问了一个更普遍的问题: 如何在应用程序中组织DI Framework使用? 我得到的反馈是,我使用的是Service Locator Pattern而不是真正的DI,正如Martin Fowler在这里指出的那样: http : //martinfowler.com/articles/injection.html 实际上,我前几天读了那篇文章,但显然还没有完全掌握它。 所以我要说我有以下代码: interface ICardReader { string GetInfo(); void SetDebugMode(bool value); void Initialize(string accountToken); void ShowAmount(string amount); void Close(); ICreditCardInfo GetCardInfo(); } public class MagTekIPAD: ICardReader { public ICreditCardInfo GetCardInfo() { var card = GetCardDataFromDevice(); // apparently the following line is wrong? var ccInfo = Inject.New(); […]

如何在Ninject中使用“复合设计模式”

validation规则合同: public interface IValidationRule { bool IsValid(); } 具体validation规则: public class MyClass : IValidationRule { public bool IsValid() { return true; } } 综合: public class ValidationRuleComposite : IValidationRule { private readonly IEnumerable _validationRules; public ValidationRuleComposite(IEnumerable validationRules) { _validationRules = validationRules; } public bool IsValid() { return _validationRules.All(x => x.IsValid()); } } 当我向IValidationRule询问IValidationRule我想得到ValidationRuleComposite 。 如果我向容器询问IValidationRule列表,我想获得除ValidationRuleComposite之外的所有IValidationRule实现。 […]