2017-02-16 9 views
1

OWIN 미들웨어 (global.asax 대신 startup.cs 사용)를 사용하여 ASP.NET MVC 5 웹 응용 프로그램 내에서 Autofac 종속성 삽입을 연결하고 컨트롤러 내에 공용 변수를 설정하십시오.속성 주입 값이 생성자에서 null입니다.

Autofac에서 자동으로 LoginController의 Test 속성을 설정하려면 속성 삽입을 사용하고 있습니다.

public interface ITest 
{ 
    string TestMethod(); 
} 

public class Test : ITest 
{ 
    public string TestMethod() 
    { 
     return "Hello world!"; 
    } 
} 

public class LoginController : Controller 
{ 
    public ITest Test { get; set; } 

    public LoginController() 
    { 
     var aaa = Test.TestMethod(); 

     // Do other stuff... 
    } 
} 

다음은 내 startup.cs의 모습입니다. 주변에서 놀았으므로이 코드 중 일부가 필요하지 않을 수도 있습니다.

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 
     builder.RegisterType<Test>().As<ITest>().SingleInstance(); 
     builder.Register(c => new Test()).As<ITest>().InstancePerDependency(); 

     builder.RegisterType<ITest>().PropertiesAutowired(); 
     builder.RegisterType<LoginController>().PropertiesAutowired(); 

     builder.RegisterModelBinderProvider(); 
     builder.RegisterFilterProvider(); 

     var container = builder.Build(); 

     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

     app.UseAutofacMiddleware(container); 

     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 

     // Some other stuff... 
    } 
} 

따라서 '테스트'공용 속성은 항상 null이므로 런타임에 중단됩니다.

어떤 아이디어가 내 문제 일 수 있습니까? 도와 주셔서 감사합니다. :)

+2

[Autotac에서 속성 주입을 사용하는 방법] 가능한 복제본 (0120)을 참조하십시오. – Steve

+0

등록을 잘못했다. 컨트롤러에는 의존성이 아닌'PropertiesAutowired'가 적용되어야합니다. – Steve

+0

Test 객체를 생성자에 전달하거나 생성자 내에서이 객체를 사용하지 않아도됩니다. 생성자가 실행되기 전에 속성을 할당 할 수 없습니다. – trailmax

답변

5

따라서 'Test'공용 속성은 항상 null이므로 런타임에 중단됩니다.

항상 null이 아닙니다. Autofac (실제로는 ALL 코드)는 이 완료 될 때까지이 될 때까지 속성을 설정할 수 없으므로 생성자에서 null입니다.

public class LoginController : Controller 
{ 
    public ITest Test { get; set; } 

    public LoginController() 
    { 
     // Test is null, will always be null here 
     var aaa = Test.TestMethod(); 
    } 
} 

슈퍼가 autofac의 버전을 dummied 않는 뭔가 같은 : 당신이 코드를 실행해야하는 경우 속성은 다음과 같은 (그러나 같은 해키 뭔가를 할 수 설정된 후

var controller = new LoginController(); 
controller.Test = new Test(); 

정말 그냥해야 생성자 주입)를 사용하여 수 : 것 다시 더 논리적 인 방법을

public class LoginController : Controller 
{ 
    private ITest _test; 
    public ITest Test 
    { 
     get { return _test; } 
     set 
     { 
     var initialize = (_test == null); 
     _test = value; 
     if (initialize) 
     { 
      Initialize(); 
     } 
     } 
    } 

    public LoginController() 
    { 
    } 

    private void Initialize() 
    { 
     var aaa = Test.TestMethod(); 
    } 
} 

을 바로해야 할 일 :

public class LoginController : Controller 
{ 
    private readonly ITest _test; 

    public LoginController(ITest test) 
    { 
     _test = test; 
     var aaa = _test.TestMethod(); 

     // Do other stuff... 
    } 
} 
+0

아, 고마워, 에릭! 테스트가 생성자가 완료된 후에 설정된다는 것을 인식하지 못했습니다. 나는 이것이 지금 일하는 것을 본다. 나는 내가 가야한다고 생각해. 고맙습니다! –