【问题标题】:Better way to create instance and run method in .NET 5在 .NET 5 中创建实例和运行方法的更好方法
【发布时间】:2016-01-09 21:10:26
【问题描述】:

我已将我的 .NET 4.5 转换为 .NET 5,一切似乎都与 DI 有关,这很棒。

为了加载我所有的 AutoMapper 配置文件,我想我会为它们创建一个接口,然后我需要执行该方法,我就是这样做的。

// interface
public interface IAutoMapperMapping
{
    void Apply();
}

// class that implements interface
public class PageMapping : IAutoMapperMapping
{
    public void Apply()
    {
        // mappaing config here
    }
}

// load all classes
public void ConfigureServices(IServiceCollection services)
{

    // Load all mappings files and apply
    var assembly = System.Reflection.Assembly.GetExecutingAssembly();
    var types = assembly.GetTypes()
        .Where(e => typeof(IAutoMapperMapping).IsAssignableFrom(e) && !e.IsInterface)
        .ToList();

    foreach (var type in types)
    {
        var instance = (IAutoMapperMapping)Activator.CreateInstance(type);
        instance.Apply();
    }
}

这是在 .NET 5 或一般的 .NET 中执行此操作的最佳方法,还是我做了应该避免的坏事?

【问题讨论】:

  • 您有什么顾虑?您是否担心某个特定的部分?
  • 我不知道是否有我真正应该使用的功能,或者是否由于 .NET 对 DI 的影响很大,我是否应该使用另一种“DI”方式,而不是使用 CreateInstance
  • 不。新的 DI 系统中没有批量注册功能,因此您必须手动编码。

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


【解决方案1】:

看起来您实际上并未向 ASP.NET 5 服务 DI 容器注册任何类型。不过,您所做的称为程序集扫描,是许多依赖注入容器的共同特征。

ASP.NET 5 中的默认容器非常基础,不包括使用程序集扫描在程序集中注册类型的能力。如果您愿意,您可以使用 ASP.NET 5 服务容器注册所有类型,然后依靠容器来解析 IAutomapperMapping 类型,而不是使用 Activator.CreateInstance

或者,您可以使用Autofac 之类的容器(还有很多其他好的容器,但我喜欢这个,因为它背后有一个庞大的社区,甚至微软也将它用于 Azure 移动服务)。您可以阅读 Autofac Assembly Scanning 以及他们对 ASP.NET 5 here 的支持。但是,您应该注意,这都是 beta 质量代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多