使用依赖注入初始化抽象类对象
Posted
技术标签:
【中文标题】使用依赖注入初始化抽象类对象【英文标题】:Initializing abstract class object using dependency injection 【发布时间】:2017-07-14 03:58:26 【问题描述】:我正在继承 ApiController,下面是我使用依赖注入重写的 ExecuteAsync 方法,
public abstract class BaseController : ApiController
private IMyService _myService;
public PersonModel person;
protected BaseController(IMyService myService)
_myService = myService;
public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
_myService.Initialize(person);
这是我的服务接口,
public interface IMyService
HttpResponseMessage Initialize(PersonModel person);
这是课程,
public class MyService : IMyService
public HttpResponseMessage Initialize(PersonModel person)
//Initializing person model from db
return new HttpResponseMessage(HttpStatusCode.OK);
当我执行这个方法时,BaseController 类中的 person 对象仍然为空。我应该改变什么来初始化抽象类中的对象?
【问题讨论】:
我猜你正在按照person = new PersonModel()
内部Initialize
的方式做一些事情。那根本行不通。你需要它来返回一个人模型,或者(一个丑陋的解决方法),使用ref
。
你使用的是哪个依赖框架?
@ArunGeorge Autofac
您使用运行时数据 (PersonModel
) 初始化应用程序组件 (IMyService
)。 This is anti-pattern.
简单地说,never use a base class in MVC or WebApi when using DI。这可以通过使用global filter 初始化数据以对 DI 友好的方式解决。
【参考方案1】:
请查看此主题,看看这是否回答了您的问题 - Registering implementations of base class with Autofac to pass in via IEnumerable
您必须适当地注册抽象类的子类。
【讨论】:
以上是关于使用依赖注入初始化抽象类对象的主要内容,如果未能解决你的问题,请参考以下文章