首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DryIoc和ExpressMapper

DryIoc和ExpressMapper
EN

Stack Overflow用户
提问于 2016-03-03 15:28:46
回答 1查看 738关注 0票数 0

我正在使用DryIoc和ExpressMapper。

我将ExpressMapper包装在另一个类中,并且在某个时候应该使用它来映射到带有参数化构造函数的类型。实际上,这是我将视图模型映射到业务模型的时候。该参数是存储库类的实例。

使用TDD,我的Mapper类就这样结束了(请注意接受Func的构造函数)。

代码语言:javascript
复制
public class Mapper<T1, T2> : IMapper<T1, T2>
{
    private readonly MappingServiceProvider _mapper;

    public Mapper()
    {
        _mapper = new MappingServiceProvider();
        _mapper.Register<T1, T2>();
    }

    public Mapper(Func<T2> func)
    {
        _mapper = new MappingServiceProvider();
        _mapper.Register<T1, T2>().Instantiate((t1) => func());
    }

    public T2 Map(T1 t)
    {
        return _mapper.Map<T1, T2>(t);
    }
}

因此,我试图像这样使用国际奥委会:

代码语言:javascript
复制
        Func<IActivitiesModel>factoryActivitiesModel = () => container.Resolve<IActivitiesModel>();
        container.Register(Made.Of(() => factoryActivitiesModel));
        // () => new ActivitiesModel(container.Resolve<IActivityRepository>(IfUnresolved.Throw)
        container.Register<IMapper<ActivitiesViewModel, IActivitiesModel>, Mapper<ActivitiesViewModel, IActivitiesModel>>(Reuse.Singleton, Made.Of(
            () => new Mapper<ActivitiesViewModel, IActivitiesModel>(Arg.Of<Func<IActivitiesModel>>())
        ));

但它没有做到。

代码语言:javascript
复制
Unable to use null factory object with factory method ActivitiesMVC.Ioc.<>c__DisplayClass4_0::System.Func`1[ActivitiesLogic.Models.IActivitiesModel] factoryActivitiesModel when resolving: Func<ActivitiesLogic.Models.IActivitiesModel>.

不管怎样,我后来尝试了不同的方法,但似乎都没有用。

我希望避免将容器存储为静态的单例,而让映射器依赖于它(我希望映射器保持Ioc不可知论)。

如何才能做到这一点?

EDIt :当前的解决方案(带有糟糕的静态单例)

代码语言:javascript
复制
public class Ioc
{
    public class Factory<T> : IFactory<T>
    {
        public T Create()
        {
            return Container.Resolve<T>();
        }
    }

    private static Lazy<Container> _container;

    public static Container Container => _container.Value;

    static Ioc()
    {
        _container = new Lazy<Container>(GetContainer);
    }

    static private Container GetContainer()
    {
        var container = new Container(rules => rules
            //.WithoutThrowOnRegisteringDisposableTransient()
            .WithTrackingDisposableTransients());
        container.Register(Made.Of(() => new ActivityController(Arg.Of<IMapper<ActivitiesViewModel, IActivitiesModel>>())));
        container.Register<ILabContext, LabContext>(new SingletonReuse());
        container.Register<IActivityRepository, ActivityRepository>(new SingletonReuse());
        container.Register<IActivitiesModel>(made: Made.Of(() => new ActivitiesModel(Arg.Of<IActivityRepository>())));
        container.Register(typeof(IFactory<>), typeof(Factory<>), new SingletonReuse());
        container.Register<IMapper<ActivitiesViewModel, IActivitiesModel>, Mapper<ActivitiesViewModel, IActivitiesModel>>(Reuse.Singleton, Made.Of(
            () => new Mapper<ActivitiesViewModel, IActivitiesModel>(Arg.Of<IFactory<IActivitiesModel>>())
        ));
        container.Register<IMapper<ActivitiesModel, ActivitiesEntity>, Mapper<ActivitiesModel, ActivitiesEntity>>(new SingletonReuse(), Made.Of(
            () => new Mapper<ActivitiesModel, ActivitiesEntity>()
        ));

        return container;
        ;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 20:15:46

首先,我不熟悉ExpressMapper,因此将尝试仅根据示例代码提供帮助。

据我了解,您希望注册活动模型、存储库、vm等,以及依赖于Func依赖的IMapper / Mapper实现。另一个细节是mapper有两个构造函数,这可能是您尝试使用Made.Of的原因。

但是Made.Of使用的是Expression>,而不是Func委托。这就是我认为例外的原因。

尝试这个设置:

代码语言:javascript
复制
container.Register(typeof(IMapper<,>), typeof(Mapper<,>), Reuse.Singleton,
    // will select second constructor with Func parameter
    made: FactoryMethod.ConstructorWithResolvableArguments);

// normal model registrations, no need to use Made.Of
// if implementations have single constructor,
// othetwise try use the same made as for Mapper.
container.Register<IActivitiesModel, ActivitiesModel>();
// ... the same way register repository, vm, etc. 

如果使用多个构造函数的情况在您的代码中很常见(可能是ExpressMapper的一个要求是有一个默认的ctor?)然后,您可以在全局配置每个容器的自动构造函数选择:

代码语言:javascript
复制
container = new Container(rules => rules
    .With(FactoryMethod.ConstructorWithResolvableArguments));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35776274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档