无法使用简单注入器进行DI

时间:2016-05-29 20:04:10

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

我是使用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();
    }
...

当我尝试运行程序时,出现此错误:

  

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

     

- [生活方式不匹配] ProductRepository(Web请求)依赖于ProductContext(Transient)。

     

- [Short Circuited Dependency] DefaultController可能错误地依赖于未注册的类型ProductRepository(Transient)而不是IProductRepository(Web Request)。

     

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

     

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

     

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

     

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

1 个答案:

答案 0 :(得分:0)

请将您的Simple Injector更新至最新版本,并查看更新的文档:

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

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