Tag: dependency injection

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

ASP.NET核心中的dependency injection

在Autofac中,您可以使用RegisterAssemblyTypes注册您的依赖项,这样您就可以完成类似这样的事情了吗?有没有办法在.net Core DI版本中做类似的事情 builder.RegisterAssemblyTypes(Assembly.Load(“SomeProject.Data”)) .Where(t => t.Name.EndsWith(“Repository”)) .AsImplementedInterfaces() .InstancePerLifetimeScope(); 这就是我想要注册的内容 LeadService.cs public class LeadService : ILeadService { private readonly ILeadTransDetailRepository _leadTransDetailRepository; public LeadService(ILeadTransDetailRepository leadTransDetailRepository) { _leadTransDetailRepository = leadTransDetailRepository; } } LeadTransDetailRepository.cs public class LeadTransDetailRepository : RepositoryBase, ILeadTransDetailRepository { public LeadTransDetailRepository(IDatabaseFactory databaseFactory) : base(databaseFactory) { } } public interface ILeadTransDetailRepository : IRepository { } 这就是我如何尝试Regisyer,但我无法弄清楚如何注册存储库Startup.cs public […]

.Net Core 2.0中Controller和BaseController中的dependency injection重复

如果我在我的Asp.Net Core 2.0 Web应用程序中创建一个BaseController,其中包含一些常见的依赖关系,它们仍然是实际控制器中必需的。 例如,默认MVC 6 Web应用程序中的标准Account和Manage控制器。 public class AccountController : Controller { private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly IEmailSender _emailSender; private readonly ILogger _logger; public AccountController( UserManager userManager, SignInManager signInManager, IEmailSender emailSender, ILogger logger) { _userManager = userManager; _signInManager = signInManager; _emailSender = emailSender; _logger = logger; } //rest of […]

基于路由参数的子容器注册

我们有一个多宿主的ASP.NET MVC应用程序,它为多个客户端托管一个预订引擎。 每个客户端都有多个可以影响Unity Container配置的软件包。 我们正在为每个请求创建一个子容器,并根据通过该路由传递的客户端和包参数注册不同的接口实现。 目前,我们通过执行以下操作来实现此目的: Controller有一个属性ServiceLocator,它使用一个统一容器来解析依赖关系。 控制器将IUnityContainer注入并分配给属性。 Controller有一个自定义ActionFilterAttribute,它访问控制器统一容器,创建子容器,根据客户端和包路由参数有条件地注册依赖项实现,然后将此子容器分配给控制器的serviceLocator。 Controller根据需要使用serviceLocator来解析各个依赖项。 这有效,但真的很笨拙,我觉得最终它将是不可持续的。 我正在寻找更好的解决方案。 我们现在仍然坚持使用.NET 4.0,直到我们结束了一些遗留的东西,所以我专门针对Unity 2。 我已经尝试创建一个自定义IDependencyResolver来创建子容器并根据路径参数注册依赖项,这些参数在Session或HttpContext项中存储容器但遇到了空HttpContext问题。 是否还有其他方法可以在路由上进行注册并将依赖项注入到控制器构造函数中? 最终我还需要一个Web API解决方案。 编辑:示例 public interface IRateService { … } public class RemoteRateService : IRateService { … } public class LocalRateService : IRateService { … } public class CustomDependencyResolver : IDependencyResolver { public object GetService(Type serviceType) { if(ChildContainer == […]

为什么在ASP.Net Core中获取IMemoryCache的多个实例?

我认为我的ASP.NET核心应用程序中的IMemoryCache的标准用法。 在startup.cs我有: services.AddMemoryCache(); 在我的控制器中,我有: private IMemoryCache memoryCache; public RoleService(IMemoryCache memoryCache) { this.memoryCache = memoryCache; } 然而,当我进行调试时,我最终得到了多个内存缓存,每个缓存中包含不同的项目。 我以为内存缓存会是单例吗? 更新了代码示例: public List GetFunctionRoles() { var cacheKey = “RolesList”; var functionRoles = this.memoryCache.Get(cacheKey) as List; if (functionRoles == null) { functionRoles = this.functionRoleDAL.ListData(orgId); this.memoryCache.Set(cacheKey, functionRoles, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromDays(1))); } } 如果我在两个不同的浏览器中运行两个客户端,当我点击第二行时,我可以看到this.memoryCache包含不同的条目。

如何在DI Frameworks中使用AOP和C#TestFrameworks? (不适用于被测物品)

我提前为一个可怕的标题道歉 – 建议欢迎! 我一直在读DI和AOP,我想我掌握了基础知识; 至少对于添加日志记录的规范示例。 我想将它应用于我们在NUnit中创建的测试用例,例如能够为所有测试用例方法和他们调用的任何“帮助方法”自动添加入口/出口日志记录。 (而且我没有与NUnit联系 – 如果在另一个框架中更容易,请告诉我。) 注意 – 这不是关于被测试的主题; 我想将这些技术应用于测试用例本身。 很明显如何使用PostSharp来做到这一点 – 这是他们的第一个例子。 但是,我不想将他们的许可处理添加到我们的项目中,仅用于此实验。 我发现AOP for C#的所有其他参考都是基于IoC容器实现提供的(动态)拦截器,例如CastleWindsor,Unity,Spring.Net ……在这种情况下它们都有一个共同的问题:你需要一个一段安装代码,用于为要添加拦截器的对象创建代理。 (我原本认为这段代码也必须创建一个IoC容器,但我发现我错了。) 但我无法看到这个设置代码将用于nUnit测试用例的位置。 我提出的选项,以及他们的问题: 让testfixture类构造函数为自己创建一个代理。 由于递归(消费者要求事物,事物试图将代理返回到事物,代理尝试创建事物……从阅读此StackOverflow问题 )将无法工作 滚动我自己的reflection魔术(对我来说这将是一项艰巨的任务) 让构造函数包装testfixture类中的所有方法并返回这个’wrapped’对象(不确定这是否可能构造函数执行此操作) 在testfixture上使用静态构造函数来做这个魔术(假设您可以动态地将类的方法包装到位。) 使用模块cctor(通过Einar Egilsson的InjectModuleInitializer )在模块级别执行某些操作,并使用日志记录包装所有类中的所有方法。 最简单的:用于实例化测试用例的某种工厂(非测试参数),我可以使用其中一个IoC代理生成器 对于nUnit:我能找到的唯一方法是创建自定义AddIn 。 优势 – 可能不会破坏与ReSharper的集成。 缺点 – 部署到所有开发人员机器,尤其是对NUnit的更新。 是否还有其他方法可以为nUnit执行此操作? 对于MbUnit:看起来它将测试用例视为第一类值 ,这很简单。 优点:易于部署到所有开发人员。 缺点:测试不会出现在Resharper中。 旁注: 如何处理设置和拆卸 。 我的选项和结论中是否遗漏了任何内容? 有没有更简单的方法来做到这一点,我错过了?

属性注入动作filter

我正在尝试使用Property Injection处理自定义操作filter属性。 它应该工作,但是,我想在属性本身使用DI。 我的filter看起来像这样 [AttributeUsage(AttributeTargets.Class)] public sealed class HeaderFilterAttribute : ActionFilterAttribute { public IMarketService MarketService { get; set; } public override void OnActionExecuted(ActionExecutedContext filterContext) { var view = (ViewResultBase)filterContext.Result; if (view != null) { BaseViewModel viewModel = view.ViewData.Model as BaseViewModel; if (viewModel != null) viewModel.Header = GetHeaderScript(); } base.OnActionExecuted(filterContext); } private string GetHeaderScript() { //Use […]

注入包含所有已注册的接口实现的Enumerable

给定以下界面: public interface IMyProcessor { void Process(); } 我希望能够注册多个实现并让我的DI容器将其中的可枚举注入到这样的类中: public class MyProcessorLibrary { private readonly IMyProcessor[] _processors; public MyProcessingThing(IMyProcessor[] processors) { this._processors = processors; } public void ProcessAll() { foreach (var processor in this._processors) { processor.Process(); } } } 这可能吗? 我当前的IMyProcessor实现静态查找所有IMyProcessor实现,但如果可以,我宁愿通过容器来实现它。 我正在使用Unity,但我很好奇其他容器是否支持它。 编辑: 谢谢你到目前为止的答案; 要清楚我想将MyProcessorLibrary注入另一个类,并将其构建为依赖对象树的连接的一部分,例如 public class MyProcessorRepository { public MyProcessorRepository(MyProcessorLibrary processorLibrary) { } } […]

Unity Container Resolve

我刚开始使用Unity Container,我的注册看起来像这样: static void UnityRegister() { _container = new UnityContainer(); _container.RegisterType(); _container.RegisterType(“Book”); _container.RegisterType(); _container.RegisterType(“Database”); } 现在当我尝试解决这个问题: var service = _container.Resolve(“Database”); 我收到以下错误: 解析依赖关系失败,type =“UnityConsoleEx.IBookService”,name =“Database”。 在解决时发生exception: 例外情况是:InvalidOperationException – 当前类型UnityConsoleEx.IBookService是一个接口,无法构造。 你错过了类型映射吗? At the time of the exception, the container was: Resolving UnityConsoleEx.IBookService,Database 谁能指出我做错了什么?