Tag: inversion of control

Winforms:如何使用IoC容器注册表单

背景 我正在构建一个winforms应用程序,我正在使用IoC容器(SimpleInjector)来注册我的类型。 在我的应用程序中,大多数屏幕(即表单)在任何给定时间只有一个实例。 问题 对于在任何给定时间只需要一个实例的表单,我可以将它们注册为单例: container.Register(Lifestyle.Singleton); 这允许我使用容器来跟踪所有表单。 但是,在这种情况下,当表单被关闭时,它将被处理掉(表单实现IDisposable)。 如果应用程序尝试使用容器再次打开该表单,则将处理该表单的容器实例,并抛出exception。 题 处理这个问题的正确方法是什么? 我目前看到两种解决方案: 对于每个表单,覆盖表单,然后隐藏表单,而不是实际关闭它。 我真的不喜欢这个主意。 我觉得我每次都要关闭表单,然后从一个新的/新的表单开始。 使用短暂的生活方式注册表单而不是单身。 在这种情况下,容器真的只是作为工厂。 我遇到两个问题:a)我失去了通过容器跟踪表单的能力,并且,b)容器在validation期间抛出exception,说一次性类型不应该被注册为瞬态(我不明白为什么这是)。 这些问题都适用于我同时需要多个实例的表单。 我可以通过在validation期间抑制诊断警告来解决问题b)。 registration = container.GetRegistration(typeof(ILoginView)).Registration; registration.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, “Winforms registration supression.”); 在这里采取正确的方法是什么? 我错过了什么吗?

使用dependency injection进行内部操作的类库的最佳实践是什么?

在构建足够复杂的类库以使用内部dependency injection时,我应该注意什么? 假设它将使用Castle Windsor(作为示例),配置容器的最佳位置/方法是什么,假设该库将由简单的控制台应用程序(没有DI)使用,Web表单使用相同的容器( Castle Windsor)和使用不同容器(NInject)的网络应用程序?

如何使用StructureMap通过代码定义默认构造函数?

我无法弄清楚如何通过代码为StructureMap(版本2.5)中的类型定义默认构造函数(当它存在重载时)。 我想获得一个服务的实例,容器必须将Linq2Sql数据上下文实例注入其中。 我用’bootstrapper’方法写了这个: ForRequestedType().TheDefault.Is.OfConcreteType(); 当我运行我的应用程序时,我收到此错误: StructureMapexception代码:202 没有为PluginFamily定义默认实例MyNamespace.Data.SqlRepository.MyDataContext,MyNamespace.Data,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null 如果我注释掉所有我不需要的Linq2Sql生成的构造函数,它可以正常工作。 更新:哦,我忘了说我不会使用[StructureMap.DefaultConstructor]属性。

用Unity填充集合的方法

我有两个示例类 class ClassToResolve { private List _coll; public ClassToResolve(List coll) { _coll = coll; } } class CollectionItem { //… } 我需要解决ClassToResolve var classToResolve = new ClassToResolve( new List() { new CollectionItem(), new CollectionItem(), new CollectionItem() } ); 现在我以某种方式解决它 var classToResolve = new ClassToResolve( new List() { unity.Resolve(), unity.Resolve(), unity.Resolve() } ); 有没有办法使用动态注册解决Unity的ClassToResolve?

如何在ASP.NET Core中解析ConfigureServices中的实例

是否可以从Startup中的ConfigureServices方法解析IOptions的实例? 通常,您可以使用IServiceProvider初始化实例,但在注册服务时此阶段没有它。 public void ConfigureServices(IServiceCollection services) { services.Configure( configuration.GetConfigurationSection(nameof(AppSettings))); // How can I resolve IOptions here? }

如何正确使用Unity将ConnectionString传递给我的存储库类?

我刚刚开始使用微软的Unity应用程序块dependency injection库,而且我已经解开了。 这是我的IoC类,它将处理我的具体类到它们的接口类型的实例化(所以每次我想在我的控制器中存储库时,我不必在IoC容器上保持调用Resolve): public class IoC { public static void Intialise(UnityConfigurationSection section, string connectionString) { _connectionString = connectionString; _container = new UnityContainer(); section.Configure(_container); } private static IUnityContainer _container; private static string _connectionString; public static IMovementRepository MovementRepository { get { return _container.Resolve(); } } } 所以,我的想法是,从我的控制器,我可以做到以下几点: _repository = IoC.MovementRepository; 我目前收到错误: exception是:InvalidOperationException – 无法构造String类型。 您必须配置容器以提供此值。 现在,我假设这是因为我的映射具体实现需要为其构造函数提供单个字符串参数。 具体课程如下: […]

IoC(Ninject)和工厂

如果我有以下代码: public class RobotNavigationService : IRobotNavigationService { public RobotNavigationService(IRobotFactory robotFactory) { //… } } public class RobotFactory : IRobotFactory { public IRobot Create(string nameOfRobot) { if (name == “Maximilian”) { return new KillerRobot(); } else { return new StandardRobot(); } } } 我的问题是在这里做反转控制的正确方法是什么? 我不想将KillerRobot和StandardRobot混凝土添加到Factory类吗? 而且我不想通过IoC.Get 带来它们吗? 那个服务地点不是真的IoC对吗? 有没有更好的方法来解决在运行时切换混凝土的问题?

使用简单注入器的每线程和每Web请求的混合生活方式

我使用SimpleInjector作为我的IoC库。 我根据网络请求注册DbContext ,它工作正常。 但是我有一个任务是在后台线程中运行它。 所以,我有一个问题是创建DbContext实例。 例如 Service1有一个DbContext实例 DbContext有一个DbContext实例 Service1和Service2从后台线程运行。 Service1获取实体并将其传递给Service2 Service2使用该实体,但实体与DbContext分离 实际上问题在于: Service1.DbContext与Service2.DbContext不同。 看来,当我在ASP.NET MVC中的一个单独的线程中运行一个任务时, DbContext为每个调用创建一个新的DbContext实例。 虽然一些IoC库(例如StructureMap )对于每个SimpleInjector -per-webrequest具有混合生活方式,但似乎SimpleInjector没有一个。 我对吗? 你有任何想法在SimpleInjector解决这个问题吗? 提前致谢。 编辑: 我的服务在这里: class Service1 : IService1 { public Service1(MyDbContext context) { } } class Service2 : IService2 { public Service2(MyDbContext context, IService1 service1) { } } class SyncServiceUsage { public SyncServiceUsage(Service2 service2) { […]

如何在ServiceStack.net中使用Funq注册多个IDbConnectionFactory实例

您将如何在Funq中注册不同的IDbConnectionFactory实例,然后直接在您的服务中访问它们? 命名实例在某种程度上发挥作用? 这是跨服务使用不同数据库时最好的方法吗? 谢谢! 编辑: 一个例子 ;)。 我可能会离开这里因为我对IoC很新,但是比如说我有2个独立的数据库连接,我想注入。 在ServiceStack中,这是在Global.asax中完成的。 container.Register(c => new OrmLiteConnectionFactory(@”Connection String 1″, SqlServerOrmLiteDialectProvider.Instance)); container.Register(c => new OrmLiteConnectionFactory(@”Connection String 2″, SqlServerOrmLiteDialectProvider.Instance)); 这两个似乎都注入了骄傲的海鲂。 然后通过以下方式在服务端自动访问它们: public IDbConnectionFactory DbFactory { get; set; } 在这种情况下,它似乎给了我第一个注册的。 如何在服务端访问特定的访问权限? 希望这会让它更加清晰。 这是ServiceStack.Examples中一个完整的示例,仅使用1个IDbConnectionFactory: Movies Rest

编写您自己的IOC容器

有人在C#写过自己的IOC容器吗? 或者绝大多数人使用各种框架,如Spring。 每个人的专业和意见是什么?