unity-container - Microsoft 企业库中 Unity 应用程序 block 的用途?

标签 unity-container enterprise-library

有人可以向我解释 Unity 应用程序 block 的用途是什么吗?我尝试浏览文档,但它都非常抽象。

Unity block 有哪些实际用途?

最佳答案

控制反转

一个快速的总结(这个主题有更多的阅读,我强烈建议阅读更多)......

微软企业模式和实践团队的 Unity 是一个控制反转容器项目,简称 IoC。就像 CaSTLe Windsor、StructureMap 等一样。这种类型的开发在 lamen 的术语中也称为松散耦合您的组件。

IoC 包含一个对象依赖注入(inject)模式,在该模式中,您依赖外部组件来连接对象内的依赖关系。

例如,您不是访问静态管理器(几乎不可能进行单元测试),而是创建一个依赖于外部依赖项来执行操作的对象。让我们以 Post 服务为例,您希望在其中访问 DB 以获取 Post。

public class PostService : IPostService
{
  private IPostRepository _postRepo;

  public PostService(IPostRepository postRepo)
  {
    _postRepo = postRepo;
  }

  public IList<Post> GetPosts()
  {
    return _postRepo.GetAllPosts().ToList();
  }
}

这个 PostService 对象现在对 IPostRepository 有一个外部依赖。请注意如何不使用混凝土和静态管理器类?相反,您有一个简单接口(interface)的松散耦合——它使您能够连接所有不同类型的实现 IPostRepository 的具体类。

Microsoft Unity 的目的是自动为您连接该 IPostRepository。所以你永远不必担心这样做:
// you never have to do this with Unity
IPostRepository repo = new PostRepository();
IPostService service = new PostService(repo); // dependency injection
IList<Post> posts = service.GetPosts();

上面显示了你必须在哪里实现两个具体的类,PostRepository() 和 PostService()。这将您的应用程序紧密耦合到需求/需要那些确切的实例,并且很难进行单元测试。

相反,您将在端点中使用 Unity(MVC 中的 Controller ,或 ASPX 页面中的代码):
IUnityContainer ioc = new UnityContainer();
IPostService postService = ioc.Resolve<IPostService>();
IList<Post> posts = postService.GetPosts();

请注意,此示例中没有使用混凝土(显然 UnityContainer 和 Post 除外)!没有具体的服务,也没有存储库。这是最好的松耦合。

这是真正的踢球者...

Unity(或任何 IoC 容器框架!)将检查 IPostService 是否存在任何依赖关系。它将看到它想要(取决于)IPostRepository 的一个实例。因此,Unity 将进入它的对象映射并查找第一个实现了在容器中注册的 IPostRepository 的对象,并返回它(即 SqlPostRepository 实例)。这就是 IoC 框架背后的真正力量——检查服务和自动连接任何依赖项的能力。

我需要完成关于 UNity、CaSTLe 和 StructureMap 比较的博文。实际上,我更喜欢 CaSTLe Windsor,因为它的配置文件选项和个人可扩展性点。

关于unity-container - Microsoft 企业库中 Unity 应用程序 block 的用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712414/

相关文章:

.net - .Net对象验证

asp.net-mvc - 无法加载文件或程序集 System.Web.WebPages.Razor、Version=3.0.0.0 或其依赖项之一

c# - 无法安装 nuget 包 unity 2

.net - 新的 .NET 3.5 项目 : Which DAL technology to use?

c# - EventSource/Enterprise Library Logging 缓存已删除的方法,(可能在仪器 list 中!)

asp.net - 企业库 4 数据配置标签

c# - UnityContainer.RegisterType 在放入静态构造函数时不会被使用

c# - 基于路由参数的子容器注册

c# - 指定要使用的 Unity IoC 容器的构造函数

c# - 配置 Enterprise Library 5.0 数据访问应用程序 block