使用 WebAPI 的 Microsoft Unity 依赖注入

Microsoft Unity Dependency Injection with WebAPI

我有以下架构:

在 WebApiConfig.cs(App_Start) 中,我通过以下方式注册统一容器:

// Unity Container Resolver
var container = new UnityContainer();

//Registers the repository interface in Resolver(IoC Register Layer)
var UResolver = new UnityRegisterContainer();
UResolver.RegisterContainer(ref container);

//Configures WebAPI DependecyResolver to use UnityResolver
config.DependencyResolver = new UnityResolver(container);

我的解析器(IoC 寄存器层):

public class UnityRegisterContainer
{
   public void RegisterContainer(ref UnityContainer container)
   {
        container.RegisterType<IUnitOfWork>(new HierarchicalLifetimeManager());
        container.RegisterType<IService>(new HierarchicalLifetimeManager());
   }
}

控制器:

public static KeyService KeyLibrary{ get; set; }

// GET api/values
[Route("Keys")]
public IEnumerable<KeyDTO> Get()
{
    var Keys = KeyLibrary.GetAllKeys();

    return Keys;
}

密钥服务:

public class KeyService: IService
{
    IUnitOfWork UOW { get; set; }

    /// <summary>
    /// Get all Keys
    /// </summary>
    /// <returns></returns>
    public IEnumerable<KeyDTO> GetAllKeys()
    {
        return Mapper.Map<IEnumerable<Key>, IEnumerable<KeyDTO>>(UOW.Keys.GetAllKeys());
    }
}

我服务

public interface IService
{
}

IUnitOfWork

public interface IUnitOfWork : IDisposable
{
    IKeyRepository Keys { get; }
    int Complete();
}

如何统一注入 class 库和存储库?

您可以使用构造函数注入并让 DependencyResolver 完成工作并将必要的依赖项传递给 类。

public class KeyController : ApiController {
    IKeyService keyService;    
    public KeyController(IKeyService keyService) {
        this.keyService = keyService
    }

    // GET api/values
    [Route("Keys")]
    public IEnumerable<KeyDTO> Get() {
        var Keys = keyService.GetAllKeys();        
        return Keys;
    }
}

public interface IKeyService : IService {
    IEnumerable<KeyDTO> GetAllKeys();
}

public class KeyService: IKeyService {
    IUnitOfWork UOW;

    public KeyService(IUnitOfWork uow) {
        this.UOW = uow
    }

    /// <summary>
    /// Get all Keys
    /// </summary>
    /// <returns></returns>
    public IEnumerable<KeyDTO> GetAllKeys() {
        return Mapper.Map<IEnumerable<Key>, IEnumerable<KeyDTO>>(UOW.Keys.GetAllKeys());
    }
}

public class UnitOfWork: IUnitOfWork {
    public UnitOfWork(IKeyRepository repository) {
        Keys = repository;
    }
    IKeyRepository Keys { get;private set }
    public int Complete(){...}
}

虽然构造函数注入是首选(有时不推荐 属性 注入),但您也可以在具有依赖性的实现 类 中使用 [Dependency] 属性,如下所示:

public class KeyService: IService
{
    // Public setter, private getter, so you can mock and manually assing in Unit Tests
    [Dependency]
    public IUnitOfWork UOW { private get; set; }

    public IEnumerable<KeyDTO> GetAllKeys()
    {
        return Mapper.Map<IEnumerable<Key>, IEnumerable<KeyDTO>>(UOW.Keys.GetAllKeys());
    }
}

Annotating Objects for Property Injection