Ars*_*eny 8 .net c# ioc-container unity2.0
这就是我现在所拥有的
Container.RegisterType<IUserManager, UserManagerMock>();
Container.RegisterType<IUser, UserMock>(
new InjectionFactory(
(c) => c.Resolve<IUserManager>().GetUser("John")));
Run Code Online (Sandbox Code Playgroud)
得到它
Container.Resolve<IProfile>();
Run Code Online (Sandbox Code Playgroud)
我想将一个名称作为参数传递给Factory,以便我能够用名称解析用户对象; 像这样的东西:
Container.Resolve<IProfile>("Jonh");
Run Code Online (Sandbox Code Playgroud)
如何更改此案例的类型注册?
虽然大多数DI框架具有执行这些类型注册的高级功能,但我个人宁愿更改应用程序的设计来解决此类问题.这使我的DI配置变得简单,使代码更容易理解.特别是对于依赖于某些上下文(线程,请求,等等)或具有必须明确管理的生命周期的对象的创建,我喜欢定义工厂.工厂使这些事情更加明确.
在您的情况下,您想要获取特定用户的个人资料.这通常是您希望拥有工厂的东西.这是一个例子:
// Definition
public interface IProfileFactory
{
IProfile CreateProfileForUser(string username);
}
// Usage
var profile = Container.Resolve<IProfileFactory>()
.CreateProfileForUser("John");
// Registration
Container.RegisterType<IProfileFactory, ProfileFactory>();
// Mock implementation
public class ProfileFactory : IProfileFactory
{
public IProfile CreateProfileForUser(string username)
{
IUser user = Container.Resolve<IUserManager>()
.GetUser(username);
return new UserProfile(user);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
Resolve方法允许传递ResolverOverride的参数.ResolverOverride的子类型是ParameterOverride,可用于将参数传递给已解析的构造函数.
你可以这样做(参数是Name,传递的值是John):
Container.Resolve<IProfile>(new ParameterOverride("Name", "John"));
Run Code Online (Sandbox Code Playgroud)