对图像使用类似依赖注入的模式

时间:2017-01-20 10:44:30

标签: c# asp.net-mvc dependency-injection .net-core

我有一个dotnet核心应用程序,其中包含一些我正在注入的依赖项。

依赖关系的结构如下:

  • Lib.cs
  • Logo.png
  • LibInfo.cs

我目前正在使用这种模式注入这些:

var container = new Container();
container.Configure(config =>
{
    config.For<ILib>().Add<Lib1>();
    config.For<LibaryInfoDto>().Add<LibInfo1>();    

    config.For<ILib>().Add<Lib2>();
    config.For<LibaryInfoDto>().Add<LibInfo2>();    

    /// ..... The goal is to not have this hard coded i just want to search the assemblies loaded for anything that extends interfaces/dto

    config.For<ILib>().Add<LibN>();
    config.For<LibaryInfoDto>().Add<LibInfoN>();    
}

我正在寻找一种注入图像的方法。我目前的思路是添加一个控制器端点,该端点根据库名称的路径构建返回图像,例如。

public ActionResult GetIcon(int libId, collection<Ilibs> libs)
{
    // Base on id get correct lib
    // Some code to return image yada yada yada
    return File(document.Data, document.ContentType);
}

但我不喜欢这种模式,但它是我唯一能想到的模式。有没有办法使用依赖注入或其他方法将一个项目中的图像放入另一个项目的目录中。我们的目标是放弃一个&#34; lib&#34;在没有任何设置的情况下,应用程序将会启动它。

---更新1

NightOwl888已经提出了我已经实现的解决方案。 这对我来说非常有效,希望它可以帮助其他任何人。

    // Controller
    public ActionResult Images(string name)
    {
        var image = _libs.FirstOrDefault(lib => lib.Name == name).LogoStream;

        string contentType = "image/png";

        return new FileStreamResult(image, contentType);
    }


    // base class for libs
    public virtual Stream LogoStream {
        get
        {
            var assembly = GetType().GetTypeInfo().Assembly;
            var name = assembly.GetName().Name;

            return assembly.GetManifestResourceStream($"{name}.{Logo}");
        }
    }

0 个答案:

没有答案