ResolutionFailedException如果Resolve失败,怎么能让Unity不扔?
有类似的东西TryResolve<IMyInterface>吗?
var container = new UnityContainer();
var foo = container.TryResolve<IFoo>();
Assert.IsNull(foo);
Run Code Online (Sandbox Code Playgroud) 我正在开始一个新的个人Prism 4项目.Reference Implementation目前使用Unity.
我想知道我是否应该使用MEF,或者只是保持Unity.
我知道有几个讨论提到这两个是不同的,它们确实有重叠,但如果我一直选择Unity,我会错过吗?
我有两个示例类
class ClassToResolve
{
private List<CollectionItem> _coll;
public ClassToResolve(List<CollectionItem> coll)
{
_coll = coll;
}
}
class CollectionItem
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我需要解决ClassToResolve
var classToResolve = new ClassToResolve(
new List<CollectionItem>()
{
new CollectionItem(),
new CollectionItem(),
new CollectionItem()
}
);
Run Code Online (Sandbox Code Playgroud)
现在我以某种方式解决它
var classToResolve = new ClassToResolve(
new List<CollectionItem>()
{
unity.Resolve<CollectionItem>(),
unity.Resolve<CollectionItem>(),
unity.Resolve<CollectionItem>()
}
);
Run Code Online (Sandbox Code Playgroud)
有没有办法使用动态注册解析ClassToResolve?
.net c# dependency-injection inversion-of-control unity-container
我有一个统一的运行代码.
现在我想使用Moq对ASP-MVC进行单元测试.在global.asax的代码中,我有以下内容:
IUnityContainer container = new UnityContainer();
container.RegisterType<IFoo, Foo>(new InjectionConstructor("xxx"));
Run Code Online (Sandbox Code Playgroud)
现在我用Moq编写了测试代码:
IUnityContainer container = new UnityContainer();
var mockFoo = new Mock<IFoo>();
Run Code Online (Sandbox Code Playgroud)
container.RegisterType<IFoo, mockFoo) >(new InjectionConstructor("xxx"));
但这不起作用.
错误:类型'Moq.Mock'不能在泛型类型或方法'Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType中用作类型参数'TTo'...没有从'Moq.Mock'到内容的隐式引用转换'IFoo的'
我有一个接口:IFoo
两个实现该接口的类:FooOne和FooTwo
两个类,ClassOne并在构造函数中ClassTwo接收一个IFoo参数.
我如何配置统一以便ClassOne接收一个FooOne实例并只ClassTwo接收FooTwo一个容器?
我不能在运行时这样做,所以它必须在配置文件中.
我在WPF应用程序中使用PRISM 5.而在我的应用程序壳牌观点有两个区域,为A和区域应该安放A包含一个弹出考虑它(PRISM 5交互功能是用来显示弹出式).
当我在视图的构造函数中创建弹出视图模型的实例时,应用程序正在工作.
工作代码
public PopupView()
{
InitializeComponent();
this.DataContext = new PopupViewModel(); // Working code
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用依赖注入创建视图模型实例时.应用程序InitializeComponent();在父视图(视图A)上失败 .
DI不工作代码
public PopupView(PopupViewModel viewModel)
{
InitializeComponent(); // Failing in AView initialze
// before reaching here
this.DataContext = viewModel;
}
Run Code Online (Sandbox Code Playgroud)
在module/bootstrapper中查看模型注册
container.RegisterType<AViewModel>();
Run Code Online (Sandbox Code Playgroud)
发生了错误
NULLReference发生异常
Stacktrace(编辑问题)
at System.DefaultBinder.BindToMethod(BindingFlags bindingAttr, MethodBase[] match, Object[]& args, ParameterModifier[] modifiers, CultureInfo cultureInfo, String[] names, Object& state)
at MS.Internal.Xaml.Runtime.DynamicMethodRuntime.CreateInstanceWithCtor(Type type, Object[] args)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args)
at MS.Internal.Xaml.Runtime.PartialTrustTolerantRuntime.CreateInstance(XamlType xamlType, Object[] args)
at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)
at …Run Code Online (Sandbox Code Playgroud) 有条件的解决是目前我还不了解的最后一件事.
让我们说我们有一个界面IAuthenticate:
public interface IAuthenticate{
bool Login(string user, string pass);
}
Run Code Online (Sandbox Code Playgroud)
现在我有两种类型的身份验证.
Twitter认证
public class TwitterAuth : IAuthenticate
{
bool Login(string user, string pass)
{
//connect to twitter api
}
}
Run Code Online (Sandbox Code Playgroud)
Facebook Auth
public class FacebookAuth: IAuthenticate
{
bool Login(string user, string pass)
{
//connect to fb api
}
}
Run Code Online (Sandbox Code Playgroud)
在unity配置中注册类型:
unityContainer.RegisterType<IAuthenticate, TwitterAuth>();
unityContainer.RegisterType<IAuthenticate, FacebookAuth>();
Run Code Online (Sandbox Code Playgroud)
在我们的控制器中通过DI注入对象:
private readonly IAuthenticate _authenticate;
public AuthenticateController(IAuthenticate authenticate)
{
_authenticate = authenticate;
}
// login with twitter
public virtual ActionResult Twitter(string user, string …Run Code Online (Sandbox Code Playgroud) c# dependency-injection inversion-of-control unity-container
在WPF项目(带棱镜)中,我们使用UnityDI框架.
最近,在我们合并了两个大分支机构之后,我们无法启动我们的应用程序StackOverflowException.由于异常的性质,我们无法得到他的调用堆栈或当前值,我们只是因为命名空间而导致问题是来自Unity.
我们花了5个多小时才找到问题所在:
简化:
我们有3-4个服务(A,B,C和D),每个服务都有一个实现,并且在某些时候,服务A需要服务B,这需要服务C,这需要服务D ,这需要服务A).基本上是循环引用.
我们想知道是否有可能添加一些Unity尝试使用实现X解决服务A的日志,并且需要解析服务B,...
这将有助于我们调试此问题,直接查看哪些服务涉及此循环引用.
反正有没有实现这个目标?
我正在使用Prism,它也是很好的Unity IoC容器.我是这个概念的新手,所以我还没有全力以赴.我现在要做的是使用IoC容器创建一个对象,但也传递一个额外的参数.请允许我用一个例子解释..:
我有一个接受命令对象的类.这是在IoC容器中注册的,因此它可以很好地处理它:
public class Person
{
public Person(IApplicationCommands commands) { .. }
..
}
Person person = _container.Resolve<Person>();
Run Code Online (Sandbox Code Playgroud)
现在 - 我想传递另一个论点 - 例如人的名字.但是,我仍然希望使用IoC容器来处理解析,从而从IoC容器中获取其他参数.但是将名称作为"自定义"参数传递.可以这样做吗?
public class Person
{
public Person(IApplicationCommands commands, string name) { .. }
..
}
string name = "John";
Person person = _container.Resolve<Person>(name); // ....??
Run Code Online (Sandbox Code Playgroud)
这个例子似乎不起作用,但有没有办法让它工作?或者Unity IoC容器是否要求在调用Resolve之前在容器中注册所有参数?
接口(在名为"Interfaces"的程序集中.在项目中: - 接口)
namespace Interfaces
{
public interface IDoSomeWork1
{
string DoSomeWork1();
}
}
namespace Interfaces
{
public interface IDoSomeWork2
{
string DoSomeWork2();
}
}
Run Code Online (Sandbox Code Playgroud)
依赖关系(在名为"实体"的程序集中.在项目中: - 实体)
namespace Entities
{
public class ClassB : IDoSomeWork1
{
public string DoSomeWork1()
{
return this.ToString();
}
}
}
namespace Entities
{
public class ClassC : IDoSomeWork2
{
public string DoSomeWork2()
{
return this.ToString();
}
}
}
Run Code Online (Sandbox Code Playgroud)
类(在项目中: - UsingUnity)
public class ClassA
{
[Dependency]
public IDoSomeWork1 DoSomeWork1 { get; set; }
[Dependency] …Run Code Online (Sandbox Code Playgroud)