2013-04-05 4 views
3

데이터베이스에 액세스하려고 시도하는 코드를 누를 때 널 참조 예외가 발생합니다.Funq 컨테이너가 제대로 작동하지 않는 이유는 무엇입니까?

이것은 global.asax에 있으며 디버거를 밟았으며이 코드가 실행 중입니다. 이 코드를 명중

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); 
    } 

} 

((사용 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; 
    } 
} 

내 Connection에 이상이 있다고 생각하거나 Funq 작업을 수행하기 위해 올바른 작업을 수행하지 않습니까?

+0

나는 또한 SqlLite에서 이것을 시도해 보았고 같은 문제가 발생했다. Funq가 내 DbConnectionFactory 인스턴스를 생성하지 않는 것 같습니다. –

+0

여기서'DbConnectionFactory.OpenDbConnection()'을 호출하고 있습니다. 실제로 어디에서 '연결 생성 중'인지 알 수 없습니다. 여기에서 뭔가를 간과하고 있습니다. – MethodMan

+0

global.asax의 Funq (IOC 컨테이너)가 처리해야합니다. 위의 파일. 적어도 그것은 내가 그것을 이해하는 방법입니다. –

답변

9

당신 널 어쩌면 중단 점을 설정 AppUserRepository 클래스에 종속성을 주입하는 Funq 컨테이너 구성을 보여줍니다. 그러나 당신은이 수업이 어떻게 그리고 어디에서 사용되는지를 보여주지 않았습니다. 질문에 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의 의존성 주입 프레임 워크를 사용하려면 사용자가 컨트롤러에 주입 할 것입니다 사용자 정의 dependency resolver를 작성해야합니다.

그럼 가서하자 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>(); 
    } 
} 

을 한 후 우리는 Application_Start에 등록 수 :

protected void Application_Start() 
{ 
    var container = new 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>(); 
    DependencyResolver.SetResolver(new FunqDependencyResolver(container)); 

    AreaRegistration.RegisterAllAreas(); 

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BootstrapSupport.BootstrapBundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles); 
} 

는 또한 나는 때문에 당신의 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; 
    } 
} 
0

당신은 당신의 결심을 어떻게 표현하지 않을 것이지만, Funq를 사용하면 추상화를 등록 할 때 공장 위임 인스턴스에서 프로젝트 주입을해야 할 것입니다.

자세한 내용은 http://funq.codeplex.com/discussions/217686을 참조하십시오.

2

IAppUserRepository을 해결하는 방법을 다음 구성으로 알려주십시오.

container.RegisterAutoWiredAs<AppUserRepository, IAppUserRepository>();

RegisterAutoWiredAs

+0

나는 AppUserRepository.GetAppUserByUsername ("user")에 대한 코드를 조회 할 때 null 참조 예외도 얻는다. –

+0

인터페이스 또는 구체적인 유형에 대한 서비스 의존성이 있습니까? – jeffgabhart

+0

나는 이것을 서비스 공개로 가지고있다. IAppUserRepository AppUserRepository {get; 세트; } –

0

문제가 여전히이

public TextBlock nullBlock; // it's your public IDbConnectionFactory DbConnectionFactory { get; set; } 
nullBlock.Text;    //   DbConnectionFactory.OpenDbConnection() 
할 것 같은 그것의

널 있도록 DbConnectionFactory 객체하게하지 않습니다이다 IDbConnectionFactory 의존성을 주입한다

개체를 설정해야합니다.

같은 사건에 뭔가

var obj = new AppUserRepository(); 
obj.DbConnectionFactory = .... // 

추가 당신이 어떤 숨겨진 코드를 입력하면

이 작업을 수행해야하고 overhanded 개체가

private IDbConnectionFactory _dbConnectionFactory 
public IDbConnectionFactory DbConnectionFactory 
{ 
     get {return _dbConnectionFactory; } 
     set {_dbConnectionFactory=value;} 
} 
관련 문제