8

这是我现在所拥有的

  Container.RegisterType<IUserManager, UserManagerMock>();
  Container.RegisterType<IUser, UserMock>(
                new InjectionFactory(
                    (c) => c.Resolve<IUserManager>().GetUser("John")));

并得到它

Container.Resolve<IProfile>();

我想将名称作为参数传递给工厂,以便能够使用名称解析用户对象;像这样的东西:

 Container.Resolve<IProfile>("Jonh");

如何更改此案例的类型注册?

4

2 回答 2

7

虽然大多数 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);
    }
}

我希望这有帮助。

于 2010-12-04T15:24:00.243 回答
6

Resolve 方法允许传递 ResolverOverride 的参数。ResolverOverride 的子类型是 ParameterOverride,可用于将参数传递给已解析的构造函数。

你可以这样做(参数是名称,传递的值是约翰):

Container.Resolve<IProfile>(new ParameterOverride("Name", "John"));
于 2010-12-03T17:07:58.720 回答