有人可以向我解释 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/