【发布时间】:2016-09-07 20:39:41
【问题描述】:
我对@987654321@ 注入或注册有疑问。 这是我的代码
存储库
namespace ClientConfiguration.Data.Repository
{
public class MappingBaseRepository : RepositoryBase<MappingBase>, IMappingBaseRepository
{
public MappingBaseRepository(IDatabaseFactory databaseFactory)
: base(databaseFactory)
{
}
}
public interface IMappingBaseRepository : IRepository<MappingBase>
{
}
}
服务
namespace ClientConfiguration.Service {
public interface IMappingBaseService
{
IEnumerable<MappingBase> GetElements();
void SaveElement();
}
public class MappingBaseService : IMappingBaseService
{
private readonly IMappingBaseRepository MappingBaseRepository;
private readonly IUnitOfWork unitOfWork;
public MappingBaseService(IMappingBaseRepository MappingBaseRepository, IUnitOfWork unitOfWork)
{
this.MappingBaseRepository = MappingBaseRepository;
this.unitOfWork = unitOfWork;
}
#region Members
public IEnumerable<MappingBase> GetElements()
{
var Elements = MappingBaseRepository.GetAll();
return Elements;
}
public void SaveElement()
{
unitOfWork.Commit();
}
#endregion
} }
Autofac 初始化
private static void SetAutofacContainer() {
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest();
// Repositories
builder.RegisterAssemblyTypes(typeof(ClientElementRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces().InstancePerRequest();
// Services
builder.RegisterAssemblyTypes(typeof(ClientElementService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces().InstancePerRequest();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
现在,如果我在控制器中,我就有一个服务对象的实例,没有问题。但我必须访问我的服务IMappingBaseService 才能从此类内的数据库中获取数据:
namespace ClientConfiguration.Mappings {
public class CustomDisplayNameAttribute : DisplayNameAttribute {
private static IMappingBaseService mappingBaseService { get; set; }
public CustomDisplayNameAttribute(string value)
: base(GetMessageFromResource(value)) {
}
private static string GetMessageFromResource(string value) {
var els = mappingBaseService.GetElements().ToList();
//get value from DB
//mappingBaseService is always null
return "";
}
}
}
任何帮助将不胜感激!提前致谢。
【问题讨论】:
-
嗨@Ahmed MHAMMI我不知道,在你的类CustomDisplayNameAttribute中,你什么时候初始化mappingBaseService?
-
您好,感谢您的回复,我必须在 autofac init 中对其进行初始化,但我不知道如何
-
如果你想让它工作,你应该在 GetMessageFromResource 中添加新参数,例如:GetMessageFromResource(string value, IMappingBaseService _mappingBaseService)。并将其分配给您的属性中的 IMappingBaseService。
-
我不能将它作为参数传递给属性
-
为什么?现在您的属性中的属性 mappingBaseService 为空。如果你不为某事分配它,它就不起作用
标签: c# asp.net-mvc .net-4.5 autofac ioc-container