【发布时间】: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