4

データベースにアクセスしようとするコードを実行すると、null 参照例外が発生します。

これは 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;
    }
}

接続に何か問題があると思いますか、それとも Funq を機能させるために何か間違ったことをしているのでしょうか?

4

4 に答える 4

9

クラスに依存関係を注入するいくつかの 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 で依存性注入フレームワークを使用する場合は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;
    }
}
于 2013-04-15T08:31:11.917 に答える
2

次の構成で解決する方法をコンテナに伝えIAppUserRepositoryます。

container.RegisterAutoWiredAs<AppUserRepository, IAppUserRepository>();

RegisterAutoWiredAsIDbConnectionFactory依存関係を注入します

于 2013-04-05T19:35:04.913 に答える
0

resolve の方法を示していませんIAppUserRepositoryが、Funq を使用すると、抽象化を登録するときにファクトリ デリゲート インスタンスでプロジェクト インジェクションを実行する必要があります。

詳細については、 http://funq.codeplex.com/discussions/217686を参照してください。

于 2013-04-05T19:29:15.583 に答える