在我的注册表中我有
Scan(scanner =>
{
scanner.AssemblyContainingType<EmailValidation>();
scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>));
});
Run Code Online (Sandbox Code Playgroud)
我应该做些什么来将这些全部定义为单身人士?
另外,作为这个问题的一小部分,有没有理由不将无状态的所有内容定义为在StructureMap中注册的单例对象?
我正在尝试使用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
您是否可以覆盖命名实例的构造函数参数,似乎您只能为默认实例执行此操作.
我想要做:
ObjectFactory.With("name").EqualTo("Matt").GetNamedInstance<IActivity>("soccer");
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用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?我只是做错了吗?
以下哪种语法被认为是最佳实践?
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这样的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中有一种方法可以用一行或一个约定来做这种重复映射吗?
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中,如何在特定的Container实例上释放和处理Http范围的对象?对于Object Factory中的默认intance,我可以执行该方法ReleaseAndDisposeAllHttpScopedObjects(),但Container类和IContainer接口似乎没有这样的方法.
我已升级到SM 3.0,现在,除了其他重大变化之外,我发现EqualToAppSetting已经消失.
我曾经能做到
.Use<SomeType>().Ctor<SomeType>("connectionStr").EqualToAppSetting("myAppSetting");
Run Code Online (Sandbox Code Playgroud)
当然,myAppSetting从app.config或web.config中提取.
现在有人知道怎么做吗?或其他一些工作?
我最近在我的代码中遇到了以下错误,这使我无法进行调试.我想基于它的接口注入一个实例,如下所示:
MovementController(IMotorController motorController)
Run Code Online (Sandbox Code Playgroud)
但是我不小心使用了这样的具体类型:
MovementController(MotorController motorController)
Run Code Online (Sandbox Code Playgroud)
该项目仍然构建并运行良好,直到我尝试motorController从MovementController实例访问.由于IMotorController访问硬件的底层实现,它必须是单例或我的锁代码.但是,由于我有其他类注入IMotorController,我现在MotorController在对象图中有两个实例,它们都通过串行连接访问硬件.这导致错误,在运行时处于更低的水平,这让我永远调试并找到真正的原因.
如何避免这种类型的错误或为我的StructureMap注册表编写单元测试以捕获这个微妙的错误?
structuremap ×10
c# ×4
unit-testing ×2
arguments ×1
asp.net-mvc ×1
constructor ×1
httpcontext ×1
lifecycle ×1
moq ×1
soa ×1
wcf ×1