【问题标题】:Unable to use Simple Injector for DI无法为 DI 使用 Simple Injector
【发布时间】:2016-05-29 20:04:09
【问题描述】:

我是使用 DI 和 ASP.NET 的新手,我很难让 Simple Injector 工作。我使用 NuGet 添加了 SimpleInjector 3.1.5 作为参考。这是我目前所拥有的:

Global.asax.cs:

...
using SimpleInjector;
using SimpleInjector.Integration.WebApi;
using SimpleInjector.Integration.Web;
using SimpleInjector.Integration.Web.Mvc;
...
protected void Application_Start()
{
        Database.SetInitializer<ProductContext>(new ProductInitializer());
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        var container = new Container();
        container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();

        container.Register<IProductRepository, ProductRepository>(Lifestyle.Scoped);

        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

        container.RegisterMvcIntegratedFilterProvider();

        container.Verify();
}

主控制器:

...
public class DefaultController : Controller
{
    private ProductRepository productRepo;

    public DefaultController(ProductRepository pr)
    {
        this.productRepo = pr;
    }
...

产品存储库类:

...
public class ProductRepository:IProductRepository
{
    private ProductContext db;

    public ProductRepository(ProductContext db)
    {
        this.db = db;
    }

    public IEnumerable<Product> GetAll()
    {
        return db.Products.ToList();
    }
...

当我尝试运行我的程序时,我收到了这个错误:

配置无效。报告了以下诊断警告:

-[Lifestyle Mismatch] ProductRepository(Web 请求)依赖于 ProductContext(瞬态)。

-[短路依赖] DefaultController 可能错误地依赖未注册的类型 ProductRepository(瞬态)而不是 IProductRepository(Web 请求)。

-[Disposable Transient Component] ProductContext 注册为transient,但实现了IDisposable。

-[Ambiguous Lifestyles] IProductRepository(Web 请求)的注册映射到与 ProductRepository(Transient)的注册相同的实现(ProductRepository),但注册映射到不同的生活方式。这将导致每个注册解析为不同的实例。

-[Ambiguous Lifestyles] ProductRepository (Transient) 的注册映射到与 IProductRepository (Web Request) 的注册相同的实现 (ProductRepository),但注册映射到不同的生活方式。这将导致每个注册解析为不同的实例。

有关警告的详细信息,请参阅错误属性。请参阅https://simpleinjector.org/diagnostics 如何解决问题以及如何抑制个别警告。

【问题讨论】:

  • 您是否包含用于与 Web API 和 MVC 集成的 Simple Injector NuGet 包?好像没有。
  • @Steven:在尝试安装用于与 Web API 集成的包时,我收到此错误:“SimpleInjector.Extensions.ExecutionContextScoping”已经依赖于“SimpleInjector”
  • 你还有一个小问题,你应该使用DI时的接口public DefaultController(IProductRepository pr)
  • @OrelEraki 这就是 Simple Injector 的美妙之处:当您致电 Verify 时,它会发出警告。但非常敏锐的观察力。
  • @ray9209 c# 编译器不会说谎;您缺少这些程序集。 NuGet 可能搞砸了;这一直在发生。只需创建一个新的 .NET 4.5 项目并重新开始。

标签: c# visual-studio asp.net-mvc-4 dependency-injection simple-injector


【解决方案1】:

请将您的 Simple Injector 更新到最新版本并检查更新的文档:

ASP.NET 核心:https://simpleinjector.readthedocs.io/en/latest/aspnetintegration.html ASP.NET MVC:https://simpleinjector.readthedocs.io/en/latest/mvcintegration.html

或从左侧边栏菜单中选择您的集成选项

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多