Tag: dependency injection

删除了C#和IoC传递依赖项

我有一个解决方案,我使用IoC(windsor)。 解决方案中的项目如下: 接口 – 保存我将使用的所有接口契约。 IoC.Installers – 保存我的依赖项的所有安装程序(引用了impl。和接口) IoC – 保存包含IoC容器的单例类。 该类执行容器的初始化过程。 控制台 – 使用IoC解决依赖关系的项目(参考IoC接口) 问题:因为IoC项目没有直接使用IoC.Installers项目,所以在Console项目的构建过程中省略了它,因此在初始化过程中没有找到安装程序。 解决方法:在IoC项目中,我添加了一个静态构造函数,它直接从IoC.Installers项目启动安装程序并使用它(我在我做的实例上执行GetType()) 解决方法的问题:我想创建一些通用的容器持有者,我可以从解决方案转移到解决方案,而无需修复我的hack。 是否有更好的方法强制IoC.Installers DLL被复制到bin文件夹而不进行黑客攻击? 最终目标是创建一个包裹castlewindsor的nuget,并尝试找到解决方案中的所有安装程序并安装它们 我正在添加一个git仓库链接 ,我在其中创建了一个可以重现问题的项目(它还包含了解决方法) 谢谢!

问题解决与Unity的依赖关系

一旦我试图解决我的unitOfWork我得到这个错误: “IUnitOfWork类型没有可访问的构造函数。” 但是,只有当我将unitOfWork的LifetimeManager设置为PerResolveLifetimeManager时才会发生这种情况。 如果我只是使用默认的,一切正常。 我的unitOfWork,有一个公共无参数构造函数。 这是我的代码: //Global asax IUnityContainer unity = new UnityContainer(); unity.RegisterType(); unity.RegisterInstance(new UnitOfWork(), new PerResolveLifetimeManager()); ControllerBuilder.Current.SetControllerFactory(new IocControllerFactory(unity)); //IocControllerFactory public class IocControllerFactory : DefaultControllerFactory { private readonly IUnityContainer _container; public IocControllerFactory(IUnityContainer container) { _container = container; } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { if (controllerType != null) return _container.Resolve(controllerType) as IController; […]

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 […]

注入的依赖项是公共可访问还是私有?

是否应将依赖项存储到具有私有setter和public getter的私有字段或属性? 这适用于构造函数DI。 为了清楚起见,在属性示例中,我不希望将这些添加到附带的接口,除非它有意义 – 即它们只在实现类型中可见: interface IFoo { void DoSomething(); } class Foo : IFoo { private readonly IService dependency; public Foo(IService dependency) { this.dependency = dependency; } } class Bar : IFoo { public Foo(IService dependency) { this.Dependency = dependency; } public IService Dependency { get; private set; } }

asp.net MVC – 如何通过不同的存储库类共享同一个SqlConnection实例

我正在创建一个使用MVC5和普通ADO.NET的新项目(仅作为学习练习),我需要创建一个存储库来注册一个模型,该模型包含多个相关对象,这些对象也需要同时创建,并且这些对象在转弯可能需要插入其他物体。 我能想到的最简单的解决方案是有一个庞大的方法(在存储库中)接收父对象的实例(其中包含需要插入的所有相关对象),并且还有一个接收所有相关的存储过程数据作为表值参数,然后使用单个事务插入所有内容。 虽然这看起来似乎是最简单的方法,但我并不是它的忠实粉丝,所以我想知道的是,我是否可以使用任何方式/通用实践来共享为父对象创建的SqlConnection的相同实例与其他相关的对象? 我想也许在相关对象的构造函数中传递SqlConnection对象,这样每个存储库只需要处理插入单个对象的逻辑,但我不确定。 编辑 ——————————- 这是父对象(Model)的存储库,我认为它应该实例化SqlConnection并启动事务 public class ModelRepository : IModelRepository { public int Add(Model entity) { using (var conn = new SqlConnection(ConnectionString)) { conn.Open(); using (var command = conn.CreateCommand()) { command.Transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted); command.CommandText = “up_Model_Insert”; command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(command.CreateParameter(“@pName “, entity.Name)); command.Parameters.Add(command.CreateParameter(“@pDescription”, entity.Description)); //Other parameters… //Call the repositories of the other objects […]

Ninject – 静态类中的内核?

是否正确使用所需的NinjectModule在一个单独的共享库中的静态类中“包装”一个StandardKernel并在需要注入时使用相同的库(而不是每次都实例化一个新内核)? 编辑:我正在尝试从我正在开发的WCF服务中使用Ninject。 (如果我刚开始学习DI和IoC容器,我说的话完全不好意思,请耐心等待)

有状态服务的dependency injection

我有一个Service Fabric状态服务,它包含一个RunAsync循环和一个OWIN Web API监听器。 是否可以在StatefulServiceinheritance的类和API控制器中添加dependency injection? 我真的只能得到一个或另一个。 如果我将容器逻辑放在Startup.cs中,那么我可以轻松地为Web API控制器获取DI,但不能获得有状态服务。 如果我将容器逻辑放在Program.cs中,那么我可以获得有状态服务而不是web api。 (实际上这感觉更像服务定位器,但在这种情况下我没关系) Program.cs中 private static void Main() { var builder = new ContainerBuilder(); builder.RegisterModule(); var container = builder.Build(); ILogger logger = container.Resolve(); ServiceRuntime.RegisterServiceAsync(“MyService”, (context) => new MyService(context, logger)).GetAwaiter().GetResult(); } 在没有将IContainer传递给StatefulService构造函数的情况下,我不知道如何将其用于Web API的Startup初始化以设置DependencyResolver。

Unity – 通过XML工厂

我使用Unity框架作为IoC容器。 我的Config看起来像这样: 我想注册一个容器来使用工厂方法。 我如何使用app.config实现它? 我正在寻找这样的东西: 有什么建议吗?

Autofac,IDisposable和手动呼叫。在某些情况下解决

我在IDisposable对象和使用Autofac时发布了一般指南问题: dependency injection和IDisposable 。 不幸的是,我没有考虑到我们项目中的一个特定场景,它实际上是一个独立的问题,所以会在这里问: 我有一个Repository对象来管理其中的会话对象的生命周期。 因此,Repository对象是IDisposable并且销毁会话(Repository在构造时注入工厂委托,在第一次使用期间实例化会话,并且如果session不为null则在IDisposable中销毁会话)。 根据上面对StackOverflow问题的引用,我理解注入了我的Repository对象的任何对象都不应该实现IDisposable,因为Autofac会处理我的存储库,如果它正在注入它们。 每个提到的StackOverflow线程,我已经开始清理我的对象中的IDisposable用法,直到我偶然发现下面显示的NotificationPublisher类。 有一些地方喜欢它的类注入了IComponentContext的实现作为工厂。 解析在函数中手动执行,因为代码库不知道在运行时之前需要注入哪个处理程序。 public class NotificationPublisher : INotificationPublisher { private readonly IComponentContext _container; private readonly INotificationManager _notificationManager; public NotificationPublisher(IComponentContext container, INotificationManager notificationManager) { _container = container; _notificationManager = notificationManager; } public IEnumerable Publish(Account account, INotificationInitiator owner, INotificationEntity entity, Int32 severity, CheckCycleContext monitoringContext) { var alertSubscriptions = _notificationManager.GetAlertSubscriptions(account, […]

dependency injection:ASP vNext。 这是怎么回事?

因此,在我基于CQRS的错误跟踪Web-API中,我在进行unit testing之前重构了我的代码(诚然,应该首先考虑); 我有这个类和构造函数: public class BugCommandHandler : IBugCommandHandler { private BugContext db; public BugCommandHandler(BugContext bugContext) { db = bugContext; } //Interface implementation } 在我的控制器中,我有这个: public class BugsController : Controller { private IBugCommandHandler commandHandler; private BugContext db; public BugsController(BugContext bugContext, IBugCommandHandler bugCommandHandler) { db = bugContext; commandHandler = bugCommandHandler; } } 最后,在我的Startup类中,我已经注入了依赖项 services.AddSingleton(); 我的unit testing和手动集成测试都工作正常,因为我在没有DI的情况下手动调用它。 BugCommandHandler实现现在如何工作,就像它在构造函数中使用数据库上下文一样被调用( […]