StructureMap3 如何为所有类型配置构造函数字符串注入?
StructureMap3 How to configure constructor string injection for all types?
我已经使用
注册了我的类型
Scan(
scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
但是我如何指定构造函数注入而不必像这样指定具体类型?
string connStr = "...";
For<IRepository().Use<MyRepository>().Ctor<string>("connectionString").Is(connStr);
您可以创建专门的存储库注册约定。
public class RepositoryConvention : IRegistrationConvention
{
private const string ConnectionString = "your connection string";
public void Process(Type type, Registry registry)
{
if (type.IsConcrete() && type.GetInterfaces().Contains(typeof(IRepository)))
{
registry.For(typeof(IRepository))
.Use(type)
.CtorDependency<string>("connectionString")
.Is(ConnectionString);
}
}
}
或创建专用类型以提供连接字符串。我敢打赌您是从 web/app.config 获取它的,因此添加抽象以访问它无论如何都会有所帮助。
public interface IConfigurationSettingsReader
{
string ReadConnectionString(string name);
T ReadSetting<T>(string settingName);
}
然后您只需将它添加为您的 MyRepository 的依赖项,您不需要在注册时显式添加它或使用自定义约定。
public class MyRepository : IRepository
{
private readonly string connectionString;
public MyRepository(IConfigurationSettingsReader settingsReader)
{
this.connectionString = settingsReader.ReadConnectionString("ConnStrName");
}
}
您可以考虑创建一个抽象的基础存储库 class 以供每个存储库继承,以摆脱安装程序板。
希望对您有所帮助!
我已经使用
注册了我的类型Scan(
scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
但是我如何指定构造函数注入而不必像这样指定具体类型?
string connStr = "...";
For<IRepository().Use<MyRepository>().Ctor<string>("connectionString").Is(connStr);
您可以创建专门的存储库注册约定。
public class RepositoryConvention : IRegistrationConvention
{
private const string ConnectionString = "your connection string";
public void Process(Type type, Registry registry)
{
if (type.IsConcrete() && type.GetInterfaces().Contains(typeof(IRepository)))
{
registry.For(typeof(IRepository))
.Use(type)
.CtorDependency<string>("connectionString")
.Is(ConnectionString);
}
}
}
或创建专用类型以提供连接字符串。我敢打赌您是从 web/app.config 获取它的,因此添加抽象以访问它无论如何都会有所帮助。
public interface IConfigurationSettingsReader
{
string ReadConnectionString(string name);
T ReadSetting<T>(string settingName);
}
然后您只需将它添加为您的 MyRepository 的依赖项,您不需要在注册时显式添加它或使用自定义约定。
public class MyRepository : IRepository
{
private readonly string connectionString;
public MyRepository(IConfigurationSettingsReader settingsReader)
{
this.connectionString = settingsReader.ReadConnectionString("ConnStrName");
}
}
您可以考虑创建一个抽象的基础存储库 class 以供每个存储库继承,以摆脱安装程序板。
希望对您有所帮助!