C# 为什么我的Funq容器不能正常工作?
当我的代码试图访问数据库时,我得到一个空引用异常 这是在global.asax中,我已经通过了调试器,并且正在执行这段代码C# 为什么我的Funq容器不能正常工作?,c#,asp.net-mvc,
servicestack,C#,Asp.net Mvc,
servicestack,当我的代码试图访问数据库时,我得到一个空引用异常 这是在global.asax中,我已经通过了调试器,并且正在执行这段代码 public class MvcApplication : System.Web.HttpApplication { public class DmsAppHost : AppHostBase { public DmsAppHost() : base("API", typeof(AppUsersService).Assembly) { }
public class MvcApplication : System.Web.HttpApplication
{
public class DmsAppHost : AppHostBase
{
public DmsAppHost() : base("API", typeof(AppUsersService).Assembly) { }
public override void Configure(Funq.Container container)
{
var dbConnectionFactory = new OrmLiteConnectionFactory("Server=localhost;Port=5432;User Id=dms; Password=dms; Database=dms", PostgreSqlDialect.Provider);
container.Register<IDbConnectionFactory>(dbConnectionFactory);
container.RegisterAutoWiredAs<AppUserRepository, IAppUserRepository>();
}
}
protected void Application_Start()
{
new DmsAppHost().Init();
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BootstrapSupport.BootstrapBundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
}
}
公共类MVCAPApplication:System.Web.HttpApplication
{
公共类DmsAppHost:AppHostBase
{
public DmsAppHost():base(“API”,typeof(AppUsersService.Assembly){}
公共覆盖无效配置(Funq.Container)
{
var dbConnectionFactory=new或mliteconnectionfactory(“服务器=localhost;端口=5432;用户Id=dms;密码=dms;数据库=dms”,postgresqldialdial.Provider);
容器注册(dbConnectionFactory);
container.RegisterAutoWiredAs();
}
}
受保护的无效应用程序\u Start()
{
新的DmsAppHost().Init();
RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BootstrapSupport.BootstrapBundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
}
}
当我点击这段代码(使用(var db=DbConnectionFactory.OpenDbConnection())时,我得到了一个NullReferenceException
对象引用未设置为对象的实例
public class AppUserRepository : IAppUserRepository
{
public IDbConnectionFactory DbConnectionFactory { get; set; }
public AppUser GetAppUserByUsername(string username)
{
AppUser appUser;
using (var db = DbConnectionFactory.OpenDbConnection())
{
appUser = db.QuerySingle<AppUser>(new { username });
}
return appUser;
}
}
公共类AppUserRepository:IAppUserRepository
{
公共IDbConnectionFactory DbConnectionFactory{get;set;}
公共AppUser GetAppUserByUsername(字符串用户名)
{
AppUser-AppUser;
使用(var db=DbConnectionFactory.OpenDbConnection())
{
appUser=db.QuerySingle(新的{username});
}
返回appUser;
}
}
我是要假设我的连接有问题,还是有什么事情我做得不对以使Funq正常工作?您没有展示您的resolve
IAppUserRepository
,但是使用Funq,您必须在注册抽象时在factory委托实例中进行任何项目注入
有关更多信息,请参阅。告诉容器如何使用以下配置解析
IAppUserRepository
container.RegisterAutoWiredAs()代码>
RegisterAutoWiredAs
将注入IDbConnectionFactory
依赖项您的问题是DbConnectionFactory
未成为对象,因此它仍然为空
好像你会这么做
public TextBlock nullBlock; // it's your public IDbConnectionFactory DbConnectionFactory { get; set; }
nullBlock.Text; // DbConnectionFactory.OpenDbConnection()
您需要设置一个对象
就你的情况来说
var obj = new AppUserRepository();
obj.DbConnectionFactory = .... //
如果您在某些隐藏代码中填充它,则会增加
您应该这样做,并设置一个断点,也许您的悬置对象为空
private IDbConnectionFactory _dbConnectionFactory
public IDbConnectionFactory DbConnectionFactory
{
get {return _dbConnectionFactory; }
set {_dbConnectionFactory=value;}
}
您已经展示了一些Funq容器配置,它将依赖项注入到您的AppUserRepository
类中。但是您还没有展示如何以及在哪里使用这个类。由于您的问题被标记为asp.net mvc
,我假设这发生在asp.net mvc控制器操作中。大致如下:
public class HomeController: Controller
{
private readonly IAppUserRepository repo;
public HomeController(IAppUserRepository repo)
{
this.repo = repo;
}
public ActionResult Index(int id)
{
var model = this.repo.Get(id);
return View(model);
}
}
如果您想在ASP.NET MVC中使用依赖项注入框架,则必须编写一个自定义框架,该框架将注入控制器
让我们继续为Funq写一篇:
public class FunqDependencyResolver : IDependencyResolver
{
private readonly ContainerResolveCache cache;
public FunqDependencyResolver(Container container)
{
this.cache = new ContainerResolveCache(container);
var controllerTypes =
(from type in Assembly.GetCallingAssembly().GetTypes()
where typeof(IController).IsAssignableFrom(type)
select type).ToList();
container.RegisterAutoWiredTypes(controllerTypes);
}
public object GetService(Type serviceType)
{
return this.cache.CreateInstance(serviceType, true);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return Enumerable.Empty<object>();
}
}
另外,我建议您对AppUserRepository
类使用构造函数注入,因为DbConnectionFactory
是该类正常工作所必需的依赖项:
public class AppUserRepository : IAppUserRepository
{
private readonly IDbConnectionFactory dbConnectionFactory;
public class AppUserRepository(IDbConnectionFactory dbConnectionFactory)
{
this.dbConnectionFactory = dbConnectionFactory;
}
public AppUser GetAppUserByUsername(string username)
{
AppUser appUser;
using (var db = this.dbConnectionFactory.OpenDbConnection())
{
appUser = db.QuerySingle<AppUser>(new { username });
}
return appUser;
}
}
公共类AppUserRepository:IAppUserRepository
{
私有只读IDbConnectionFactory dbConnectionFactory;
公共类AppUserRepository(IDbConnectionFactory dbConnectionFactory)
{
this.dbConnectionFactory=dbConnectionFactory;
}
公共AppUser GetAppUserByUsername(字符串用户名)
{
AppUser-AppUser;
使用(var db=this.dbConnectionFactory.OpenDbConnection())
{
appUser=db.QuerySingle(新的{username});
}
返回appUser;
}
}
我也尝试过使用SqlLite,但也遇到了同样的问题。Funq似乎没有创建我的DbConnectionFactory的实例。这里您调用的是DbConnectionFactory.OpenDbConnection()
我看不出您实际在哪里创建连接我是否忽略了这里的某些内容它应该由上面global.asax文件中的Funq(IOC容器)处理。至少我是这样理解它的。你能用你最新的代码示例更新吗?现在很难说事情在哪里。是不是因为IoC容器只适用于服务中出现的那些实例,而且因为我在存储库中使用它,而不是通过服务使用它,所以它就不起作用了?我添加了这一点,但当它在AppUserRepository.GetAppUserByUsername(“用户”)的代码中出现时然后我还得到一个空引用异常。您在服务中的依赖关系是针对接口还是具体类型的?我在服务公共IAppUserRepository AppUserRepository{get;set;}中有此项
public class AppUserRepository : IAppUserRepository
{
private readonly IDbConnectionFactory dbConnectionFactory;
public class AppUserRepository(IDbConnectionFactory dbConnectionFactory)
{
this.dbConnectionFactory = dbConnectionFactory;
}
public AppUser GetAppUserByUsername(string username)
{
AppUser appUser;
using (var db = this.dbConnectionFactory.OpenDbConnection())
{
appUser = db.QuerySingle<AppUser>(new { username });
}
return appUser;
}
}