Autofac:注册组件时调用初始化方法

tbo*_*ins 1 c# autofac

我只是想知道当我注册它时是否可以调用我的服务中的方法。

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)

Cyr*_*and 7

您可以使用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)