Tag: inversion of control

如何使用Xamarin和Autofac将构造函数依赖项注入ViewModel?

我有一个ViewModel,我想在其中注入另一个类。 我正在使用Visual Studio和最新版本的Xamarin。 我正在使用Autofac来注册解析依赖项。 但我是新手,我遇到了一个我无法找到解决方案的问题,即使它可能很简单。 这是我想要注入另一个类的类: public IMessagingCenterWrapper MessagingCenterWrapper; public LoginViewModel(IMessagingCenterWrapper messagingCenterWrapper){ MessagingCenterWrapper = messagingCenterWrapper; } 然后在应用程序的入口点我有一个函数初始化容器,它注册并解析依赖项 static IContainer container{ get; set; } public App () { InitializeComponent(); InitializeIOCContainer(); } void InitializeIOCContainer() { var builder = new ContainerBuilder(); builder.RegisterType(); builder.RegisterType().As(); container = builder.Build(); var wrapper = container.Resolve(); var viewModel = container.Resolve(); } 但是在登录视图中的行中构建时出错: BindingContext = […]

ASP.Net MVC5和StructureMap4 – 简化方法

在将StructureMap.MVC5集成到ASP.Net MVC5 Web应用程序时,意识到它使用3.1版本的SM而不是4+。 然后尝试获取此Nuget中包含的文件并将其更改为SM4,但是有很多代码存在,并且SM3.1和SM4之间存在多个不兼容的调用。 有了这个,我最终编写了一个简单的IoC,如下所示。 寻找有关其不足之处的建议以及与此处链接的Nuget版本相比效率低下的问题。 定义默认注册表 public class DefaultRegistry : Registry { public DefaultRegistry() { Scan( scan => { scan.Assembly(“MyAssembly”); scan.WithDefaultConventions(); }); For<IContext>().Use(); } } 创建一个静态容器 public static class IoC { private static IContainer container = new Container(c => c.AddRegistry()); public static IContainer Container { get { return container; } } } 覆盖控制器工厂 public […]

使用MVC和Ninject作为IoC容器构建WinForms应用程序

我不得不重新编写一个大型的WinForms应用程序,我想使用MVC来增加测试能力等。我也想采用Ninject作为我的IoC容器,因为它重量轻,速度快,并且会增加我的应用程序的可扩展性。 我已经做了很多阅读,并且我已经成功地开始了这个新应用程序的结构。 但是,在使用Ninject时,我不确定我是否有正确的想法。 代码… 从Program.cs和相关类开始…… static class Program { [STAThread] static void Main() { FileLogHandler fileLogHandler = new FileLogHandler(Utils.GetLogFilePath()); Log.LogHandler = fileLogHandler; Log.Trace(“Program.Main(): Logging initialized”); CompositionRoot.Initialize(new ApplicationModule()); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(CompositionRoot.Resolve()); } } public class CompositionRoot { private static IKernel _ninjectKernel; public static void Initialize(INinjectModule module) { _ninjectKernel = new StandardKernel(module); } public static T Resolve() […]

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

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

如何将此服务定位器模式转换为真正的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(); […]

我怎样才能将spring.net注入方法?

我在spring.net论坛上发布了以下内容,但也希望我可以在这里获得一些有价值的观点: 我正在寻找一些关于如何达到以下要求的建议。 首先是一些背景 – 我使用Spring.NET来实现IOC depdenecny注入我的asp.net c#多层Web应用程序。 通过spring.net xml配置文件实现注入,通过开发针对接口并在需要的接口实现类中注入来实现我的所有开发。 这对我来说都很好。 我相信,我的知识将是中等水平。 我已经遇到了问题并希望为它找到解决方案。 举个例子,我有一个带有几种方法的类,它们都从数据库中检索,数据被缓存一段时间。 我希望能够自由地为每个方法注入缓存的特征,例如。 它存在于缓存等的时间。因此,我不想在类中注入其所需的位置,而是希望能够将值注入到方法中。 我可以继续为每个方法创建类的属性,但这会变得混乱,或者在我的类中注入设置。 我倾向于通过弹簧注射控制每种方法。 所以任何想法如何实现这一点,因为我期望它比其他人可能遇到过。 我想出的一个可能的想法是以某种方式通过spring为每个方法注入一个属性,属性具有属性,该属性具有方法中所需的值,例如缓存持续时间等。这是一个可行的解决方案吗? 如果是这样,任何人都可以协助我配置这样的。 或者,如果任何人有任何其他想法,那将是伟大的。

如何在Castle.Windsor中配置提供多个服务的单个组件实例?

我想配置Windsor容器,以便单个单例样式的实例可以通过容器提供两个或更多服务。 我发现在多个组件声明(基于XML的配置)中使用相同的类型将导致创建该类型的实例以提供每个组件的服务接口,这不是我想要的行为。 例如: interface IA { } interface IB { } class AB : IA, IB { … } 我希望AB的一个实例同时提供IA和IB服务。 我想要这样做的具体原因是我的具体DAO实现扩展了多个接口。 另一方面,我有几个工作组件,它们包含对不同接口的引用。 具体的DAO实例尊重这一点,但是这些单独的工作组件的构造函数需要实现它们的单独接口,我希望Castle.Windsor通过相应的服务请求将相同的对象实例传递给这些工作容器。 大声笑,我觉得这很清楚! :P 有没有人明白我的意思,有没有人有任何想法如何通过组件的XML配置实现这一点?

使用Autofac注册基类的实现,以通过IEnumerable传入

我有一个基类,以及一系列inheritance自此类的其他类: (请原谅过度使用的动物类比) 公共抽象类Animal {} 公共课狗:动物{} 公共类猫:动物{} 然后我有一个依赖于IEnumerable public class AnimalFeeder { private readonly IEnumerable _animals; public AnimalFeeder(IEnumerable animals ) { _animals = animals; } } 如果我手动做这样的事情: var animals = typeof(Animal).Assembly.GetTypes() .Where(x => x.IsSubclassOf(typeof(Animal))) .ToList(); 然后我可以看到这会让Dog和Cat回归 但是,当我尝试连接我的Autofac时: builder.RegisterAssemblyTypes(typeof(Animal).Assembly) .Where(t => t.IsSubclassOf(typeof(Animal))); builder.RegisterType(); 实例化AnimalFeeder ,没有Animal传入构造函数。 我错过了什么吗?

如何在不强迫用户使用库的IOC容器的情况下编写库

简短的问题是:鉴于图书馆保证使用特定的IOC容器作为其内部,当应用程序使用该库时,给定应用程序保证使用IOC容器连接其依赖关系,如果两个容器不同,给出它们怎么能一起玩得好吗? 方案是,应用程序具有依赖于库中类型的类。 因此,当应用程序容器尝试构建此类时,它需要知道如何解析库中的类型。 这是一个冗长的问题: 在SO之前,这个问题似乎确实以不同的forms和forms被问过,但我似乎无法找到我需要的答案,因此我将使用一个假设的_over_simplified_具体示例。 我们希望编写一个用于日志记录的库,用户可以在其解决方案中将其作为包包含在内,以便开箱即用地获取日志记录function。 库公开的公共接口是.. public interface ILogger {} public interface ITarget {} 具体实现是 internal class Logger: ILogger { public Logger(ITarget target) {}} internal class FileTarget : ITarget {} 要求是,如果用户包含我们的包并定义了一个具有ILogger类型属性的类或者具有类型ILogger的ctor参数,那么我们的库负责将该接口的具体实现注入用户定义的类。 默认情况下,注入的logger将转到文件系统进行日志记录,因为注入ILogger实现的FileTarget的默认实现是我们库的FileTarget 。 如果用户决定编写实现ITarget接口的类,那么我们的库将使用它来注入Logger类而不使用其默认的FileTarget实现。 所以我想certificate的是,他们在这里是双向依赖。 我们的库依赖于用户的程序集,因为它需要扫描用户的程序集以加载任何扩展点(即ITarget实现),并在任何默认实现之前将它们注入到自己的对象中。 用户的程序集依赖于库,因为如果用户选择使用ILogger接口作为依赖项来定义类,那么该用户对象应该获得对我们的库在运行时提供的该接口的具体引用。 简单的解决方案是,如果用户和我们的库都使用相同的IOC容器,那么问题就解决了。 但这是一个强有力的假设。 我想做的是 使用IOC容器和最符合库要求的库,在我的例子中是Ninject。 在运行时以某种方式为用户提供了一种机制,让用户可以通过某些API调用我的库来确保Ninject被激活并扫描用户的程序集,并连接所有考虑所有扩展点的所有内容。 到目前为止这么好,它是完全可以实现的,但这里是棘手的部分。 如果用户也在使用Ninject,那么问题会自动解决,因为Ninject已经知道如何解决生活在我们库中的接口。 但是如果用户决定使用他/她选择的IOC容器怎么办? 我几乎想要在库中使用这样的接口定义某种子容器function public interface IDependencyResolvingModule { T Get(); []T GetAll(); […]

注册没有特定构造函数签名的控制器时,已添加具有相同键的项

这真的很奇怪。 有一个使用Autofac 3.3的MVC 5应用程序,当我添加一个没有特定构造函数签名的新控制器时,抛出An item with the same key has already been added的An item with the same key has already been added错误。 我该如何调试呢? 如果构造函数如下所示,那么当我导航到该控制器的url时,它会加载正常: public class ProductController : Controller { private readonly IServiceManager _serviceManager; public ProductController(IServiceManager serviceManager) { _serviceManager = serviceManager; } } 但是如果我添加一个没有构造函数,无参数构造函数或其他各种签名的新控制器并导航到它爆炸的特定URL: public class QuestionController : Controller { // explodes public QuestionController() { […]