我正在使用Silverlight v4和WCF Ria Services启动一个新的LOB应用程序.我们的想法是使用Prism v4,包括MVVM,MEF和Unity.
我可以将所有这些"技术"结合起来使用:可以设想哪种架构场景?
编写一个骨架来构建这种可以重用的应用程序是否有意义?也许已经作为样本申请存在?
(在Prism v4中有很多示例项目,但没有包含所有"技术"的项目)
提前致谢.
我已经试过几乎所有的东西,但我不能让AutoMapper映射A =>乙当B没有参数的构造函数.
我正在使用Unity并且所有依赖项都被方便地注册了,但是,我怎么说AutoMapper"嘿,如果目标实例需要构造函数中的某些依赖项,请让Unity构建它,然后再进行映射.
我试过了
Mapper.Initialize(configuration =>
{
configuration.ConstructServicesUsing(container.Resolve);
configuration.CreateMap<Person, PersonViewModel>();
});
Run Code Online (Sandbox Code Playgroud)
但它不起作用:(
编辑:事实上,我撒谎了一下.我没有使用Unity.我正在使用格雷斯,但不想提出一个相对未知的容器询问有关进展主题:)
我已经解决了这个问题,它和丝绸一样光滑.确切的代码是这样的.请记住,我正在使用Grace IoC Container(我热切推荐).
Bootstrapper.Instance.Configure(new CompositionRoot());
Mapper.Configuration.ConstructServicesUsing(type => Bootstrapper.Instance.Container.Locate(type));
Mapper.CreateMap<Person, PersonViewModel>()
.ConstructUsingServiceLocator();
Run Code Online (Sandbox Code Playgroud) inversion-of-control unity-container automapper constructor-injection
我有以下课程:
public class Foo : IFoo
{
public Foo(IBar[] bars);
}
Run Code Online (Sandbox Code Playgroud)
IBar具有在UnityContainer中注册的多个实现。当我打电话
UnityContainer.Resolve()我希望容器将所有已知的IBar实现注入到对象中。
我该如何实现?
我有一个使用Unity for DI的应用程序但我在编写单元测试时遇到了一些麻烦.在我的一些业务层方法中,我有与此类似的代码:
var obj = container.Resolve<ISomeObj>();
Run Code Online (Sandbox Code Playgroud)
这要么是站在一个最终会传递给数据库的内存中对象,要么是最终传递给客户端的内存中对象.但问题是RhinoMocks(貌似)无法正确地模拟容器,所以做这样的事情:
mockContainer = MockRepository.GenerateMock<IUnityContainer>();
mockContainer.Expect(x => x.Resolve<ISomeObj>())
.Return(mockObj);
Run Code Online (Sandbox Code Playgroud)
在这里获得异常似乎是有道理的,因为容器实际上是空的,但我没有看到解决问题的直接方法.我曾考虑用包装器抽出容器以解决这个问题,但这似乎有点矫枉过正.
任何想法或建议都非常感谢!
- - 编辑 - -
由于Yacoub发布了他的答案,我一直在阅读有关服务定位器(反)模式的一些内容,虽然人们普遍认为这是一种反模式,但我还没有找到关于如何处理POCO的答案.
使用上面的例子,似乎我的问题的一般答案是做这样的事情:
public class Foo()
{
private ISomeObj someObj;
public Foo(ISomeObj injectObj)
{
someObj = injectObj;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为我对此方法的唯一抱怨是它(可能)使构造函数"忙"ala:
public class Foo()
{
public Foo(ISomeService injectSvc, ISomeObj injectObj, ISomeObj2 injectObj2, ISomeObj3 injectObj3)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
此外,除非我遗漏了某些内容,否则我需要一种方法来重新初始化给定的实例以供重用.含义:如果MethodA()和MethodB()都使用了ISomeObj,当MethodA()完成ISomeObj时,我需要重新初始化ISomeObj中的所有字段,以便MethodB()可以完成它的工作.
解决这个问题的"最佳"方法是什么?
c# unit-testing dependency-injection rhino-mocks unity-container
我想从ModuleA视图导航到ModuleB视图。如何实现模块之间的导航?
在使用Prism框架的应用程序中,我有两个模块
我在Bootstrapper中配置两个模块,如下所示:
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
moduleCatalog.AddModule(typeof(ModuleA));
moduleCatalog.AddModule(typeof(ModuleB));
}
Run Code Online (Sandbox Code Playgroud)
我像这样在我的ModuleA和ModuleB中注册我的两个视图:
public class ModuleA : IModule
{
private readonly IRegionManager regionManager;
private readonly IUnityContainer container;
public StaffModule(IUnityContainer container, IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
}
public void Initialize()
{
this.regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<StaffView>());
}
}
public class AccountModule : IModule
{
private readonly IRegionManager regionManager;
private readonly IUnityContainer container; …Run Code Online (Sandbox Code Playgroud) 尽管 PerRequestLifetimeManager 生命周期管理器工作正常,并且可以帮助处理HTTP 请求范围内的有状态或线程不安全的依赖项,但在可以避免的情况下使用它通常不是一个好主意,因为它通常会导致错误实践或在使用不当时难以在最终用户的应用程序代码中发现错误。建议您注册的依赖项是无状态的,如果需要在 HTTP 请求的生命周期内在多个对象之间共享公共状态,那么您可以拥有一个无状态服务,该服务使用 Items 集合显式存储和检索此状态当前对象。
警告指的是哪种错误或不良做法?一个人会如何错误地使用它?- 不幸的是,警告不是很具体,因此很难应用于现实世界。此外,我不清楚在这种情况下有状态意味着什么。
恕我直言,使用 PerRequestLifetimeManager 的典型场景是某种数据库连接(例如 DbContext)或类似的。
调用 API 时出现以下异常:
InvalidOperationException - The current type, System.Collections.Generic.IReadOnlyDictionary`2[System.Type,Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptionsExtension], is an interface and cannot be constructed. Are you missing a type mapping?
这是完整的错误:
{
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred when trying to create a controller of type 'TechnicianController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Resolution of the dependency …Run Code Online (Sandbox Code Playgroud) c# ×4
prism ×2
asp.net ×1
asp.net-mvc ×1
automapper ×1
mef ×1
mvvm ×1
rhino-mocks ×1
unit-testing ×1
wpf ×1