Tag: dependency injection

控制台应用程序的dependency injection和项目结构

我有4个项目: 核心(IServer): 系统 System.Core程序 DependencyResolver: 核心 StructureMap 基础设施(服务): 核心 外部依赖 安慰: 核心 DependencyResolver Requierements: 我试图只在DependencyResolver中使用StructureMap。 此外,控制台应用程序不应该了解有关Infrastucture的任何信息。 当我不想在我的控制台应用程序上引用StructureMap时,我必须构建一个ServiceLocator。 在DependencyResolver中我有一个Bootstrapper负责调用StructureMap注册表内容(Register) 在我的控制台应用程序中,我想获得一个实例。 为此,我需要引用StructureMap。 另一种方法是在StructureMaps解析方法周围编写一个小包装器。 还有其他更好的方法将控制台与StructureMap分离吗?

StructureMap中的命名实例和默认实例?

在我的StructureMap引导代码中,我使用自定义约定来扫描程序集,并将接口/实现对作为命名实例添加到对象图中。 基本上我有一些逻辑可以检查配置设置,并根据不同的条件深入到这个语句: registry.For(interfaceType).Use(type) .Named(implementationName); 这样可以很好地添加所有命名实例。 但是,我还想在未指定实例名称的情况下添加默认实例。 但是,默认实例并不总是添加到图表中的最后一个实例。 有时在扫描期间会添加其他命名实例。 但是,似乎最后添加的任何一个实例,无论它是否被命名,都始终是默认的。 我尝试了各种流畅的API组合,包括: registry.For(interfaceType).Add(type); 要么: registry.For(interfaceType).Use(type); 甚至一些被标记为弃用的。 但最终的行为始终是最后一个是默认行为。 因此,如果添加实现的顺序是这样的: 对于Logger接口,使用名为“Log4Net”的Log4Net实现 对于Logger接口,默认使用Log4Net实现 对于Logger接口,使用名为“Mock”的Mock实现 由此产生的行为是,当未指定名称时,“Mock”实现将用作默认值。 调试容器中的AllInstances ,我按以下顺序看到: 名为“Log4Net”的Log4Net记录器实例 Log4Net记录器的一个实例,带有名称的GUID(就像我可以告诉的那样,任何其他默认实例) Mock记录器的一个实例名为“Mock” 但是,从没有实例名称的容器调用时调试到日志记录语句会导致使用Mock实现。 有没有办法将默认实例添加到对象图中,同时仍然能够在之后添加命名实例?

如何使用dependency injection从多个源获取配置?

我正在使用Simple Injector,但也许我需要的更多是一个概念性的答案。 这是交易,假设我有一个界面与我的应用程序设置: public interface IApplicationSettings { bool EnableLogging { get; } bool CopyLocal { get; } string ServerName { get; } } 然后,通常会有一个实现IApplicationSettings的类,从指定的源获取每个字段,例如: public class AppConfigSettings : IApplicationSettings { private bool? enableLogging; public bool EnableLogging { get { if (enableLogging == null) { enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings[“EnableLogging”]; } return enableLogging; } } … } 然而! […]

从另一个命令Handle()方法中调用命令

您好我正在使用Simple Injector DI库并且已经关注了一些关于围绕命令模式设计的架构模型的非常有趣的材料: 同时……在我的架构的命令端 同时……在我的架构的查询方面 容器将管理UnitOfWork的生命周期,我使用命令来执行数据库的特定function。 我的问题是,如果我有一个命令,例如AddNewCustomerCommand ,它反过来又对另一个服务执行另一个调用(即发送文本消息),从设计的角度来看这是可以接受的,还是应该在更高的层次上完成,如果是的话怎么做到最好? 示例代码如下: public class AddNewBusinessUnitHandler : ICommandHandler { private IUnitOfWork uow; private ICommandHandler otherHandler; AddNewBusinessUnitHandler(IUnitOfWork uow, ICommandHandler otherHandler) { this.uow = uow; this.otherHandler = otherHandler; } public void Handle(AddBusinessUnitCommand command) { var businessUnit = new BusinessUnit() { Name = command.BusinessUnitName, Address = command.BusinessUnitAddress }; var otherCommand = new […]

通用命令处理程序的简单注入器用法

接口,命令和命令处理程序按照Simpleinjector wiki中的说明进行设置。 public interface ICommand { string Name { get; set; } } public class Command1 : ICommand { public string Name { get; set; } } public class Command2 : ICommand { public string Name { get; set; } } public interface ICommandHandler { void Execute(TCommand Command); } public class Command1Handler : ICommandHandler { […]

如何在ASP.NET Web API上对Action Filter执行依赖项注入

我真的陷入了将dependency injection到web api的动作filter中的方法。 我有一个这样的动作filter: public class AuthorizationAttribute : ActionFilterAttribute { public IApiKeyRepository Repository { get; set; } private Guid GetApiKey(string customerKey) { return Repository.GetApiKey(customerKey); } public override void OnActionExecuting(HttpActionContext actionContext) { } } 我想通过使用Windsor在属性Repository上进行属性注入(但是使用哪个IoC容器并不重要) 我确实想要自定义FilterProvider,但它没有为我工作,有没有人有解决方案或运行代码? 非常感谢

MVC 4 Autofac和Generic Repository模式

我正在使用我的MVC 4应用程序中的工作单元和通用存储库模式。 我试图解决的问题是为我系统中的每个实体创建Repository存根。 为了利用Autofac Ioc,我必须为每个实体创建一个存储库类和接口,以便我可以在Autofac中注册它。 应用开始…… builder.RegisterType().As().InstancePerHttpRequest(); 存储库类 public class SchoolDetailRepository : RepositoryBase, ISchoolDetailRepository { public SchoolDetailRepository(IDatabaseFactory databaseFactory) : base(databaseFactory) { } } 接口 public interface ISchoolDetailRepository : IRepository { } 这似乎是一项额外的工作。 有没有办法注册Type的通用存储库而不是创建所有这些空类? 然后在我的服务类中,我可以通过Ioc将通用类型传递给构造函数,例如… public class SchoolService : ISchoolService { private readonly IRepository _schoolRepository; private readonly IUnitOfWork _unitOfWork; public SchoolService(IRepository schoolRepository, IUnitOfWork unitOfWork) { this._schoolRepository […]

autofac中的条件组件注册

是否可以有条件地在其他组件的状态上注册组件? 就像是: ContainerBuilder.RegisterConditionally( Func, Func); 我发现在autofac的V2之前,可以使用“ Register().OnlyIf() ”构造,它看起来像我正在寻找的那个。 我希望此function有条件地覆盖默认注册。 class CommonRegistrations { public virtual void Register(ContainderBuilder builder) { builder.Register(ctx => LoadSettings()).As().SingleInstance(); builder.RegisterType().As(); } } class SpecificRegistrations : CommonRegistrations { public virtual void Register(ContainerBuilder builder) { base.Register(builder); builder.ConditionalyRegister( ctx => ctx.Resolve().ReallyUseSpecificFoo, ctx => new SpecificFoo()).As(); } } … var builder = new ContainerBuilder(); var registrations = […]

当我转向dependency injection时,使用语句会发生什么

我目前正在使用以下代码: public class MyProvider { public MyProvider() { } public void Fetch() { using (PopClient popClient = new PopClient()) { …. } } } 因为我希望能够对Fetch方法进行unit testing,并且由于我无法模拟PopClient,所以我创建了一个接口和一个调用PopClient的包装类。 我的更新代码如下: public class MyProvider { private readonly IPopClient popClient; public MyProvider(IPopClient popClient) { this.popClient = popClient; } public void Fetch() { using (var pop3 = popClient) { …. } […]

如何将AutoMapper与Ninject.Web.Mvc一起使用?

建立 我有一个AutoMapperConfiguration静态类,用于设置AutoMapper映射: static class AutoMapperConfiguration() { internal static void SetupMappings() { Mapper.CreateMap.ConvertUsing<IdToEntityConverter>(); } } 其中IdToEntityConverter是一个自定义的ITypeConverter ,如下所示: class IdToEntityConverter : ITypeConverter where T : Entity { private readonly IRepository _repo; public IdToEntityConverter(IRepository repo) { _repo = repo; } public T Convert(ResolutionContext context) { return _repo.GetSingle(context.SourceValue); } } IdToEntityConverter在其构造函数中获取IRepository ,以便通过命中数据库将ID转换回实际实体。 请注意它没有默认构造函数。 在我的ASP.NET的Global.asax ,这就是我对OnApplicationStarted()和CreateKernel() : protected override void […]