c# - Unity Application Block,如何将参数传递给注入(inject)工厂?

标签 c# .net ioc-container unity2.0

这是我现在拥有的

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

得到它

Container.Resolve<IProfile>();

我想将名称作为参数传递给工厂,这样我就可以用名称解析用户对象; 像这样:

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

如何更改这种情况下的类型注册?

最佳答案

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

希望对您有所帮助。

关于c# - Unity Application Block,如何将参数传递给注入(inject)工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343492/

相关文章:

c# - 通用 .NET 类中的 public static (const)

c# - 如何在 C# 中找出句子中的下一个单词?

c# - 将 IEnumerable<int> 中的所有值相乘

asp.net-mvc - 在混合 ASP.NET WebForms MVC 项目中配置 IoC 容器

c# - foreach 是否对 IEnumerable<struct> 应用装箱?

c# - 将所有用户数据保存在 Forms 身份验证 cookie 中

c# - 所有情况下的 IoC 容器? (针对静态类)

java - 我想定义一个没有接口(interface)的 Spring Bean CLASS

c# - WPF ScrollViewer - 将水平滚动条对齐到顶部?

C# ObservableCollection 不会出现在 MVVM 的 TreeView 中