标签: structuremap

StructureMap:如何在与ConnectImplementationsToTypesClosing相关的类型上设置生命周期

在我的注册表中我有

Scan(scanner =>
         {
             scanner.AssemblyContainingType<EmailValidation>();
             scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>));
         });
Run Code Online (Sandbox Code Playgroud)

我应该做些什么来将这些全部定义为单身人士?

另外,作为这个问题的一小部分,有没有理由不将无状态的所有内容定义为在StructureMap中注册的单例对象?

c# structuremap lifecycle inversion-of-control

6
推荐指数
1
解决办法
1947
查看次数

StructureMap Setter注入不设置属性

我正在尝试使用StructureMap为我的MVC项目设置setter/property注入,但我似乎无法设置属性.我很清楚构造函数注入是推荐的做法,但我有一个严格的要求,要求我们使用setter注入,所以请保持评论试图告诉我否则.

我有正常的样板设置代码,例如我的Global.asax中的以下内容

ControllerBuilder.Current.SetControllerFactory(new TestControllerFactory());

ObjectFactory.Initialize(x => {
            x.For<IPaymentService>().Use<PaymentService>();
            x.ForConcreteType<HomeController>().Configure.Setter<IPaymentService>(y => y.PaymentService).IsTheDefault();
            x.SetAllProperties(y =>
            {
                y.OfType<IPaymentService>();
            });

        });
Run Code Online (Sandbox Code Playgroud)

我的TestControllerFactory如下所示:

public class TestControllerFactory:System.Web.Mvc.DefaultControllerFactory
{
    protected  IController GetControllerInstance(Type controllerType)
    {
        if (controllerType == null)
            throw new ArgumentNullException("controllerType");
        return ObjectFactory.GetInstance(controllerType) as IController ;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下服务/实现类对

public interface IPaymentService
{

}

public class PaymentService:IPaymentService
{

}
Run Code Online (Sandbox Code Playgroud)

最后,我的控制器将具有需要将具体支付服务实现注入其中的属性:

public class HomeController:Controller {public IPaymentService Service {get; set;}

 public ActionResult Index(){
        var test = Service... //Service is Null
 }
Run Code Online (Sandbox Code Playgroud)

}

如上所示,当我调试时,该属性保持为null.

另外,我尝试使用[SetterProperty]只是为了看它是否有效(我无意将控制器与这些属性耦合),它仍然没有用.

我不确定我是否需要做其他事情,或者问题可能是什么.我一直在使用StructMap的构造函数注入很长一段时间.

c# structuremap dependency-injection inversion-of-control asp.net-mvc-3

6
推荐指数
1
解决办法
2953
查看次数

StructureMap - 覆盖命名实例的构造函数参数

您是否可以覆盖命名实例的构造函数参数,似乎您只能为默认实例执行此操作.

我想要做:

ObjectFactory.With("name").EqualTo("Matt").GetNamedInstance<IActivity>("soccer"); 
Run Code Online (Sandbox Code Playgroud)

structuremap inversion-of-control

5
推荐指数
1
解决办法
1597
查看次数

如何使用StructureMap 2.5.3附带的MoqAutoMocker?

我正在尝试使用StructureMap附带的MoqAutoMocker类,但我找不到任何应该如何使用它的示例.我必须继续使用的是使用RhinoMocks的StructureMap站点示例.

我要做的是使用Get方法引用我的一个自动模拟/注入依赖项.根据上面的链接,我应该可以做这样的事情

    // This retrieves the mock object for IMockedService
    autoMocker.Get<IMockedService>().AssertWasCalled(s => s.Go());
Run Code Online (Sandbox Code Playgroud)

注意如何使用AssertWasCalled,这表明Get函数返回对RhinoMocks Mock对象的引用?当我使用MoqAutoMocker时,同样的代码对我不起作用.

我有一个类SignInController,它依赖于构造函数中的ISecurityService.在示例中使用了像RhinoAutoMocker这样的MoqAutoMocker,我想我应该能够做到这一点......

var autoMocker = new MoqAutoMocker<SignInController>();
autoMocker.Get<ISecurityService>().Setup(ss => ss.ValidateLogin
(It.IsAny<string>(), It.IsAny<string>())).Returns(true); 
Run Code Online (Sandbox Code Playgroud)

但问题是我永远无法访问Setup方法.在这种情况下,对autoMocker.Get的调用似乎返回了一个ISecurityService实例而不是Mock <ISecurityService>

有没有人以这种方式成功使用过MoqAutoMocker?我只是做错了吗?

structuremap unit-testing moq

5
推荐指数
1
解决办法
2966
查看次数

哪个Structuremap生命周期是最佳实践?(v2.5.4)

以下哪种语法被认为是最佳实践?

For<IMyInterface>().LifecycleIs(new HybridLifecycle()).Use<MyImplementation>();

For<IMyInterface>().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.Hybrid)).Use<MyImplementation>();
Run Code Online (Sandbox Code Playgroud)

如果第一个是正确的,我可以创建一个对象HybridLifecycle,并将其用于多个For <...>语句,还是每个For <>都需要创建一个新的HybridLifecycle?

structuremap

5
推荐指数
1
解决办法
2115
查看次数

使用WCF + IOC Structuremap的SOA体系结构

我对像StructureMap这样的DI容器有点新,我用asp.net mvc应用程序已经用了很短的时间.现在,我正在拆分我的架构,它将拥有一个WCF服务层和一些消费者,如ASP.NET MVC应用程序,Silverlight应用程序和Winfors/WPF应用程序.当我使用带有asp.net mvc的SM时,我已经通过asp.net mvc的应用程序启动初始化了IOC,现在,对于许多项目使用我无法想象IOC配置应该位于的好地方.我也想在服务层制作DI(注入存储库).

在这种情况下,我在哪里加载我的IOC配置以及我将如何在整个项目中使用(比如只在asp.net mvc应用程序中需要控制器工厂)?

structuremap asp.net-mvc wcf soa

5
推荐指数
1
解决办法
1486
查看次数

如何使用StructureMap映射的IRepository <T>约定

在StructureMap中有一种方法可以用一行或一个约定来做这种重复映射吗?

    For<IRepository<Mailout>>().Use<MailoutRepository>();
    For<IRepository<MailServer>>().Use<MailServerRepository>();
    For<IRepository<MailoutStatus>>().Use<MailoutStatusRepository>();
    For<IRepository<MailoutTemplate>>().Use<MailoutTemplateRepository>();
    For<IRepository<Publication>>().Use<PublicationRepository>();
    For<IRepository<Recipient>>().Use<RecipientRepository>();
Run Code Online (Sandbox Code Playgroud)

structuremap

5
推荐指数
1
解决办法
535
查看次数

如何在Container实例上释放和处置所有Http范围的对象?

在StructureMap中,如何在特定的Container实例上释放和处理Http范围的对象?对于Object Factory中的默认intance,我可以执行该方法ReleaseAndDisposeAllHttpScopedObjects(),但Container类和IContainer接口似乎没有这样的方法.

c# structuremap httpcontext

5
推荐指数
1
解决办法
1627
查看次数

Structuremap 3.0 EqualToAppSetting

我已升级到SM 3.0,现在,除了其他重大变化之外,我发现EqualToAppSetting已经消失.

我曾经能做到

  .Use<SomeType>().Ctor<SomeType>("connectionStr").EqualToAppSetting("myAppSetting");
Run Code Online (Sandbox Code Playgroud)

当然,myAppSetting从app.config或web.config中提取.

现在有人知道怎么做吗?或其他一些工作?

structuremap constructor arguments structuremap3

5
推荐指数
1
解决办法
544
查看次数

如何避免或UnitTest意外使用具体的单例类型而不是使用StructureMap进行抽象

我最近在我的代码中遇到了以下错误,这使我无法进行调试.我想基于它的接口注入一个实例,如下所示:

MovementController(IMotorController motorController)
Run Code Online (Sandbox Code Playgroud)

但是我不小心使用了这样的具体类型:

MovementController(MotorController motorController)
Run Code Online (Sandbox Code Playgroud)

该项目仍然构建并运行良好,直到我尝试motorControllerMovementController实例访问.由于IMotorController访问硬件的底层实现,它必须是单例或我的锁代码.但是,由于我有其他类注入IMotorController,我现在MotorController在对象图中有两个实例,它们都通过串行连接访问硬件.这导致错误,在运行时处于更低的水平,这让我永远调试并找到真正的原因.

如何避免这种类型的错误或为我的StructureMap注册表编写单元测试以捕获这个微妙的错误?

c# structuremap unit-testing

5
推荐指数
1
解决办法
81
查看次数