Tag: dependency injection

IoC在类库中。 在哪里引导

我正在使用可以被其他组件重用的类库。 在这个类库中,我使用unity来进行dependency injection。 对于这个类库,我创建了一个测试项目。 调用者也获得了一个测试项目。 我不确定的一件事是绑定的位置。 我应该将其合并到类库中,还是应该从调用应用程序中执行此操作?

使用接口或类进行dependency injection

在使用dependency injection时,我一直认为我的接口和具体类之间存在一对一的关系。 当我需要向接口添加方法时,我最终会破坏实现该接口的所有类。 这是一个简单的例子,但我们假设我需要将一个ILogger注入我的一个类中。 public interface ILogger { void Info(string message); } public class Logger : ILogger { public void Info(string message) { } } 像这样的一对一关系感觉就像代码味道。 由于我只有一个实现,如果我创建一个类并将Info方法标记为虚拟以在我的测试中覆盖而不是仅为单个类创建一个接口,是否有任何潜在的问题? public class Logger { public virtual void Info(string message) { // Log to file } } 如果我需要另一个实现,我可以覆盖Info方法: public class SqlLogger : Logger { public override void Info(string message) […]

DI的一个接口的多个实现

现在我正在尝试使用Autofac的IOC容器自学习dependency injection模式。 我想出了一个非常简单的例子,如下所示。 虽然示例很简单,但我无法正常工作。 这是我的类/接口: 两个怪物,都实现了IMonster接口: interface IMonster { void IntroduceYourself(); } class Vampire : IMonster { public delegate Vampire Factory(int age); int mAge; public Vampire(int age) { mAge = age; } public void IntroduceYourself() { Console.WriteLine(“Hi, I’m a ” + mAge + ” years old vampire!”); } } class Zombie : IMonster { public […]

如何配置Ninject以便它为每个Controller创建一个实例

我正在尝试将Ninject用于MVC5应用程序,我想知道是否有任何方法可以配置它以便为每个Controller实例化一个对象(我不确定它是否与每个请求相同),使用该实例在控制器的任何Action中,一旦Action完成,就释放对象使用的所有资源。 我希望Ninject在我的控制器中注入的类实现了IDisposable接口。 到目前为止,我试过这个: private static void RegisterServices(IKernel kernel) { kernel.Bind().To(); } 但Dispose方法永远不会被调用。 我也试过InRequestScope ,但它也InRequestScope 。 到目前为止,唯一真正有用的是在EVERY Controller的Action中的using语句中包装我需要的对象的实例化。 像这样的东西: using (var uow = UnitOfWorkFactory.Create()) { var repos = new UserRepository(uow); uow.SaveChanges(); } 编辑: 由Ninject包添加的NinjectWebCommon类 public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// /// Starts the application /// public static void […]

可能的GetObjectsOfType替换

我有这小段代码 var idObjects = Spring.Context.Support.ContextRegistry.GetContext() .GetObjectsOfType(typeof (ICustomInterfaceThatDoesSomething)); foreach (ICustomInterfaceThatDoesSomething icitds in idObjects.Values) icitds.DoSomething(); 有没有办法可以避免这种情况,让spring.net自动将单例注入我声明的属性,就像一个ICustomInterfaceThatDoesSomething数组? 我想要这样的事情的唯一原因是因为我想杀死项目的.dll依赖项,这是单一的使用点。

C# – 在使用没有引用的dependency injection时将dll复制到exe输出目录?

我有一个C#解决方案,我使用dependency injection来解析dll之间的引用。 我有一个exe项目和一些其他没有被exe引用的dll项目(它通过IoC容器使用dll)。 项目设置是默认的visual studio设置,它在其自己的文件夹中构建每个dll。 由于exe没有引用dll,因此它们永远不会被复制到exe的输出目录中,并且不会被IoC框架找到。 你怎么处理这个? 你在同一个目录中构建它们吗? 使用post build copy命令? 或者是其他东西?

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

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

ASP.NET MVC3 + ActionFilterAttribute +注入?

嘿那里,我已经成功地在我的FilterAttribute中使用了属性注入,但是我想知道它是否可以将它移动到构造函数中呢? 我目前的代码: // AuthAttribute.cs public class AuthAttribute : ActionFilterAttribute { public Roles _authRoles { get; private set; } [Inject] private readonly IAuthorizationService _service; public AuthAttribute(Roles roles) { _authRoles = roles; } public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath; string redirectUrl = string.Format(“?returnUrl={0}”, redirectOnSuccess); string loginUrl = FormsAuthentication.LoginUrl + redirectUrl; […]

如何使用unity + UnityAutoRegistration打开通用装饰器链接

在阅读了关于命令处理程序装饰的这篇文章之后,今天在一个有趣的切线上走了。 我想看看我是否可以使用Unity而不是SimpleInjector来实现模式,到目前为止它certificate是非常困难的。 我要做的第一件事是安装UnityAutoRegistration来解析开放的通用ICommandHandler接口。 该方面的当前解决方案如下: Container = new UnityContainer().LoadConfiguration(); Container.ConfigureAutoRegistration() .ExcludeSystemAssemblies() .Include(type => type.ImplementsOpenGeneric(typeof(ICommandHandler)), (t, c) => c.RegisterType(typeof(ICommandHandler), t) ) .ApplyAutoRegistration() ; 这适用于第一部分,解决任何单个 ICommandHandler 。 到目前为止,令人沮丧的是实施装饰处理程序。 一旦我添加第二个ICommandHandler作为装饰器,Unity就会抛出StackOverflowException。 我不太了解Unity内部,但我猜这是因为它无法确定要解析的实例 – 命令处理程序或命令处理程序装饰器 – 因为它们都实现了ICommandHandler接口。 谷歌搜索引导我首先阅读这篇文章 ,它解释了如何在我认为的蛮力方法中做到这一点。 我也找到了这些 相关的 页面,但没有一个是我问题的完整解决方案(我太无知了,不能自己解决)。 然后我找到了这篇文章,这似乎解决了我同样的担忧 。 然而,强大的解决方案并不能解决开放式generics问题。 目前,我们的大多数依赖项都是从.config文件中的unity部分加载的,所以我不想为每个处理程序或装饰器编写大量的编译代码。 似乎有某种UnityContainerExtension和DecoratorBuildStrategy是正确的方法,但我无法弄明白。 我现在已经玩了一段时间的powershell代码了,而且完全卡住了。 我尝试修改他的代码以考虑generics导致BadImageFormatExceptions(尝试加载具有不正确格式的程序。(HRESULT的exception:0x8007000B))。 我喜欢这样做以实现装饰器链接的想法,因为它很短,每个关注点只有1行: var container = new Container(); // Go look in all assemblies […]

Autofac:注册组件并根据解析父级进行解析

我想要注册一个组件来解析基于它可能解析的类的参数。 (这听起来有点令人困惑,所以我会举一个例子)。 这是一个使用记录器的对象: class MyObject : IMyObject { public ILogger Logger; public MyObject(ILogger logger) { Logger = logger; } } 现在,COULD中传递的记录器在类与类之间是不同的。 所以我有一个相当修补的想法,如何在下面这样做: class MyLogger : ILogger { public string Name{get; protected set;} public static ILogger GetLogger(string className) { Name = className; MyLogger logger; // Do something to choose a logger for that specific class return […]