Tag: structuremap

StructureMap通过注入而不是服务位置来解析依赖性

在我的项目中,我使用汇编扫描程序注册了许多ISerializers实现。 FWIW这是注册我的ISerializers的代码 Scan(scanner => { scanner.AssemblyContainingType(); scanner.AddAllTypesOf().NameBy(type => type.Name); scanner.WithDefaultConventions(); }); 然后正确注册 ISerializer (…ISerializer) Scoped as: Transient JsonSerializer Configured Instance of …JsonSerializer BsonSerializer Configured Instance of …BsonSerializer 等等。 目前,我能够弄清楚如何解决我想要的串行器的唯一方法是使用硬编码服务位置调用 jsonSerializer = ObjectFactory.GetNamedInstance(“JsonSerializer”); 现在我在class上知道我特别想要jsonSerializer,所以有没有办法配置一个规则或类似的东西,说ISerializer根据属性名连接命名实例? 所以我可以 MySomeClass(ISerializer jsonSerializer, ….) StructureMap正确解决了这种情况? 或者我正在接近这个错误,也许我应该只注册实现ISerializer的具体类型,然后专门使用 MySomeClass(JsonSerializer jsonSerializer, ….) 对于具体类的这些方面的东西?

如何在StructureMap中发布HybridHttpOrThreadLocalScoped对象?

在Windows服务中执行后台任务时,我使用HybridHttpOrThreadLocalScoped存储NHibernate ISessions的内容。 由于在Windows Server中没有HTTPContext,我想知道只调用ReleaseAndDisposeAllHttpScopedObjects()是否足以释放该线程的ISession实例?

StructureMap针对所有可能的具体实现注册generics类型

我有以下内容: public interface ICommand { } public class AddUser : ICommand { public string Name { get; set; } public string Password { get; set; } } public interface ICommandHandler : IHandler where T : ICommand { void Execute(T command); } public class AddUserHandler : ICommandHandler { public void Execute(AddUser command) { Console.WriteLine(“{0}: User added: […]

dependency injection和开发生产力

抽象 在过去的几个月里,我一直在编写一个轻量级,基于C#的游戏引擎,它具有API抽象和实体/组件/脚本系统。 它的整体想法是通过提供类似于Unity引擎的架构来简化XNA,SlimDX等游戏开发过程。 设计挑战 正如大多数游戏开发者所知,在整个代码中需要访问许多不同的服务 。 许多开发人员使用全局静态实例,例如渲染管理器(或composer php),场景,图形设备(DX),记录器,输入状态,视口,窗口等。 全局静态实例/单例有一些替代方法。 一种是通过构造函数或构造函数/属性dependency injection(DI)为每个类提供它需要访问的类的实例,另一种是使用全局服务定位器,如StructureMap的ObjectFactory,其中服务定位器通常配置为一个IoC容器。 dependency injection 出于多种原因,我选择了DI方式。 最明显的一个是可测试性,通过对接口进行编程并具有通过构造函数提供给它们的每个类的所有依赖关系,这些类很容易测试,因为测试容器可以实例化所需的服务或它们的模拟,并输入到每个class级都要进行测试。 不管你信不信,做DI / IoC的另一个原因是提高代码的可读性。 没有更多的初始化过程实例化所有不同的服务,并通过引用所需服务手动实例化类。 配置内核(NInject)/注册表(StructureMap)可以方便地为引擎/游戏提供单点配置,其中选择和配置服务实现。 我的问题 我常常觉得我正在为接口创建接口 我的工作效率急剧下降,因为我所做的只是担心如何以DI方式做事,而不是快速简单的全局静态方式。 在某些情况下,例如在运行时实例化新实体时,需要访问IoC容器/内核来创建实例。 这会产生对IoC容器本身的依赖(SM中的ObjectFactory,Ninject中的内核实例) ,这实际上与首先使用它的原因背道而驰 。 怎么解决这个问题? 我想到了抽象工厂,但这进一步使代码复杂化。 根据服务要求,某些类的构造函数可能变得非常大,这将使该类在其他上下文中完全无用,如果不使用IoC。 基本上做DI / IoC会大大降低我的工作效率,在某些情况下会进一步使代码和架构复杂化。 因此,我不确定这是一条我应该遵循的道路,还是只是放弃并以老式的方式做事。 我不是在寻找一个单一的答案,说明我应该或不应该做什么,而是讨论从长远来看使用DI是否值得,而不是使用全局静态/单一方式,可能的优点和缺点我忽略了处理DI时,上面列出的问题的可能解决方案。

entity framework:在运行时更改连接字符串

假设有一个ASP.NET MVC应用程序使用Entity Framework 6,代码优先方法和StructureMap作为IoC。 它还使用工作单元模式。 以下是代码: 域类 public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } IUnitOfWork和DbContext: public interface IUnitOfWork { IDbSet Set() where TEntity : class; int SaveChanges(); } public class Sample07Context : DbContext, IUnitOfWork { public […]

structuremap – 同一接口的两个实现

我有一个服务类与以下ctor: public class (IMessageService emailService, IMessageService smsService) { … } 以及IMessageService (电子邮件和短信)的两种实现。 如何配置容器以正确解析此构造函数? 这是命名实例进入的地方,还是另一种情况?

由特定构造函数构造的Structuremap addalltypesof

我非常喜欢StructureMap作为IOC框架,尤其是基于约定的注册。 现在我尝试执行以下操作:当类具有默认(无参数)构造函数时,我想添加实现特定接口的所有类型。 并且必须使用此构造函数创建类型。 这是我现在直到注册正确类型的东西,但是如何指定在创建实例时应该使用默认构造函数。 public class MyRegistry : Registry { public MyRegistry() { Scan( x => { x.AssemblyContainingType(); x.Exclude(t => !HasDefaultConstructor(t)); x.AddAllTypesOf(); }); } private static bool HasDefaultConstructor(Type type) { var _constructors = type.GetConstructors(); return _constructors.Any(c => IsDefaultConstructor(c)); } private static bool IsDefaultConstructor(ConstructorInfo constructor) { return !constructor.GetParameters().Any(); } }

无效控制器时的StructureMap错误

我正在使用像Rob Conery那样的MVC店面的结构图,我有一个AdminController,所以我只需输入: website/Admin/action 但如果我拼错控制器名称,我会得到以下错误: exception详细信息:System.ArgumentNullException:值不能为null。 参数名称:key 此行发生错误: Controller controller = ObjectFactory.GetInstance(controllerType) as Controller; 有没有人对我如何处理这个错误有任何想法,或者根本不允许它发生,也许只是转到404页面? 提前干杯

为什么Nhibernate在我的MVC应用程序中跨多个请求共享会话?

我们有一个MVC项目,通过StructureMap构建NHibernate依赖项 var sessionFactory = ConnectionRegistry.CreateSessionFactory(); For().Singleton().Use(sessionFactory); For().Singleton().Use(); ConnectionRegistry.CreateSessionFactory看起来像这样 public static ISessionFactory CreateSessionFactory() where T : ICurrentSessionContext { if (_sessionFactory == null) { lock (_SyncLock) { if (_sessionFactory == null) { var cfg = Fluently.Configure() .Database(MsSqlConfiguration.MsSql2005.ConnectionString(DataFactory.ConnectionString)) .CurrentSessionContext() .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) .ExposeConfiguration(c => c.SetProperty(“generate_statistics”, “true”)) .ExposeConfiguration(c => c.SetProperty(“sql_exception_converter”, typeof(SqlServerExceptionConverter).AssemblyQualifiedName)); try { _sessionFactory = cfg.BuildSessionFactory(); } catch (Exception […]

StructureMap:选择嵌套依赖项的具体类型

计算器: public interface ICalculator { int Calculate(int a, int b); } public class Calculator : ICalculator { private readonly ICalculatorStrategy _calculatorStrategy; public Calculator(ICalculatorStrategy calculatorStrategy) { _calculatorStrategy = calculatorStrategy; } public int Calculate(int a, int b) { return _calculatorStrategy.Calculate(a, b); } } 计算器stragies: public interface ICalculatorStrategy { int Calculate(int a, int b); } public class AdditionCalculator […]