我只是想知道当我注册它时是否可以调用我的服务中的方法。
public interface IDataService
{
User GetUserById(int id);
void SaveUser(int id, User user);
}
public class DataService : IDataService
{
public User GetUserById(int id)
{
// do stuff
};
public void SaveUser(int id, User user)
{
// do stuff
};
public void InitialiseService() { };
}
Run Code Online (Sandbox Code Playgroud)
当我注册此组件时,是否可以调用 InitialiseService 来初始化我的服务?
builder.RegisterType<DataService>()
.Keyed<IDataService>(FiberModule.Key_DoNotSerialize)
.AsImplementedInterfaces()
.SingleInstance();
Run Code Online (Sandbox Code Playgroud)
您可以使用OnActivating伪事件:
builder.RegisterType<DataService>()
.Keyed<IDataService>(FiberModule.Key_DoNotSerialize)
.AsImplementedInterfaces()
.OnActivating(e => e.Instance.InitialiseService())
.SingleInstance();
Run Code Online (Sandbox Code Playgroud)
看起来你正在做一个单例,所以你也可以考虑实现IStartable将由Autofac自动实例化的接口
public class DataService : IDataService, IStartable
{
public User GetUserById(int id)
{
// do stuff
}
public void SaveUser(int id, User user)
{
// do stuff
}
public void Start()
{
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用该AutoActivate方法让Autofac自动创建实例。
builder.RegisterType<DataService>()
.Keyed<IDataService>(FiberModule.Key_DoNotSerialize)
.AsImplementedInterfaces()
.AutoActivate()
.SingleInstance();
Run Code Online (Sandbox Code Playgroud)
或在容器构建后使用RegisterBuildCallbacka 上的方法执行操作ContainerBuilder
builder.RegisterType<DataService>()
.Keyed<IDataService>(FiberModule.Key_DoNotSerialize)
.AsImplementedInterfaces()
.SingleInstance();
builder.RegisterBuildCallback(c => c.Resolve<IDataSerialize>().Initialise());
Run Code Online (Sandbox Code Playgroud)