【问题标题】:How to Integrate third party library instances with structure Map如何将第三方库实例与结构图集成
【发布时间】:2016-07-14 15:07:23
【问题描述】:

有没有人尝试使用结构 Map 管理他们的第三方实例?

长期以来,我管理第三方库的方法一直是围绕库 api 编写一个包装器。

我面临的困境是如何利用结构映射的依赖注入优势,同时我仍然可以保留我对第三方库的包装器。

例如,如果我有一个 LibraryClass 并且我有我的类 WrapperClass。我的包装器构造函数如下所示。

    class WrapperClass : IWrapperClass{
       var instance;
       public WrapperClass(){
            instance = new LibrayClass();
       }
    }

这样做的问题是,无论我在代码中使用什么,我都无法模拟这个对象,因为结构映射需要访问 LibraryClass 类型才能加载 WrapperClass。

人们为此做了什么?我是否应该将 LibraryClass 类型暴露给结构映射并希望它只通过结构映射加载?

【问题讨论】:

    标签: c# structuremap


    【解决方案1】:

    每当我需要注入第三方依赖项时,我都会在其周围放置一个带有接口的包装器。我没有将对象公开为实例,而是尝试在包装器上公开底层对象的功能。例如,给定 AmazonS3,包装器类可能类似于

    class FileStorage : IFileStorage
    {
        private AmazonS3 _amazon;
        public FileStorage(AmazonS3 amazon) { _amazon = amazon }
        void StoreFile(string file, string key)
        {
                _amazon.StoreFile(file, key);
        }
    }
    

    然后您可以将 IFileStorage 注入到您的类中,因为它是一个接口,您可以模拟该类进行测试。

    然后在结构映射配置中注册第三个库类类型。

    【讨论】:

    • 结构图不会抱怨 AmazonS3 没有在结构图对象工厂中注册吗?
    • 根据您的需要,您有几个选择。 1. 将 AmazonS3 注册到结构映射 2. 将 IFileStorage 设置为 For().Use().ctor().Is(new AmazonS3) 3. 在构造函数中新建 AmazonS3 并将其从参数列表对于数字 2,我不记得它是否为构造函数做单例,如果你走那条路线需要调查一下
    • 好的,这就是我要问的,所以你确实将第三方库类型暴露给结构映射。
    • 抱歉,刚刚通过评论更新,我一直按回车键而不是 shift +回车键。
    • 是的,我就是这么想的,在包装器中封装第三个库类型是没有办法的。我必须接受这种暴露才能利用结构图的好处。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2021-01-29
    • 2019-01-02
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多