首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在StructureMap中使用策略的示例缺少依赖项

在StructureMap中使用策略的示例缺少依赖项
EN

Stack Overflow用户
提问于 2016-06-22 09:13:05
回答 1查看 258关注 0票数 0

我试图让例2了解如何在StructureMap中使用策略。我创建了一个小测试项目(下面的代码)。不幸的是,由于某些原因,似乎存在一些依赖问题,因为.As<type>.Each都无法工作。

对于使用As的行,如

代码语言:javascript
复制
user.Green.As<Database>().ConnectionString.ShouldBe("*green*");

我发现了一个错误:

'IDatabase‘不包含'As’的定义,也不包含扩展方法,因为可以找到'IDatabase‘类型的第一个参数(您缺少使用指令或程序集引用吗?)对于这一行:

代码语言:javascript
复制
instance.Constructor.GetParameters()
                .Where(x => x.ParameterType == typeof(IDatabase))
                .Each(param => ...

“StringExtensions.Each(IEnumerable,Action)”由于其保护级别而无法访问。

我使用StructureMap 4.2安装了NuGet。正如您在下面的代码中所看到的,我将所有可以找到的using-statements从StructureMap中放进去,但我仍然有问题。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StructureMap;
using StructureMap.Pipeline;
using StructureMap.Pipeline.Lazy;
using StructureMap.Configuration;
using StructureMap.Building;
using StructureMap.Attributes;
using StructureMap.AutoMocking;
using StructureMap.Graph;
using StructureMap.Query;
using StructureMap.TypeRules;
using StructureMap.Util;
using StructureMap.Building.Interception;
using StructureMap.Configuration.DSL;
using StructureMap.Diagnostics.TreeView;
using StructureMap.Graph.Scanning;

namespace TestStructureMapPolicies
{
    class Program
    {
        static void Main(string[] args)
        {
            var container = new Container(_ =>
            {
                _.For<IDatabase>().Add<Database>().Named("red")
                    .Ctor<string>("connectionString").Is("*red*");

                _.For<IDatabase>().Add<Database>().Named("green")
                    .Ctor<string>("connectionString").Is("*green*");

                _.Policies.Add<InjectDatabaseByName>();
            });


            // ImportantService should get the "red" database
            container.GetInstance<ImportantService>()
                .DB.As<Database>().ConnectionString.ShouldBe("*red*");

            // BigService should get the "green" database
            container.GetInstance<BigService>()
                .DB.As<Database>().ConnectionString.ShouldBe("*green*");

            // DoubleDatabaseUser gets both
            var user = container.GetInstance<DoubleDatabaseUser>();

            user.Green.As<Database>().ConnectionString.ShouldBe("*green*");
            user.Red.As<Database>().ConnectionString.ShouldBe("*red*");

        }
    }

    public interface IDatabase { }

    public class Database : IDatabase
    {
        public string ConnectionString { get; set; }

        public Database(string connectionString)
        {
            ConnectionString = connectionString;
        }

        public override string ToString()
        {
            return string.Format("ConnectionString: {0}", ConnectionString);
        }
    }

    public class InjectDatabaseByName : ConfiguredInstancePolicy
    {
        protected override void apply(Type pluginType, IConfiguredInstance instance)
        {
            instance.Constructor.GetParameters()
                .Where(x => x.ParameterType == typeof(IDatabase))
                .Each(param =>
                {
                        // Using ReferencedInstance here tells StructureMap
                        // to "use the IDatabase by this name"
                        var db = new ReferencedInstance(param.Name);
                    instance.Dependencies.AddForConstructorParameter(param, db);
                });
        }
    }

    public class BigService
    {
        public BigService(IDatabase green)
        {
            DB = green;
        }

        public IDatabase DB { get; set; }
    }

    public class ImportantService
    {
        public ImportantService(IDatabase red)
        {
            DB = red;
        }

        public IDatabase DB { get; set; }
    }

    public class DoubleDatabaseUser
    {
        public DoubleDatabaseUser(IDatabase red, IDatabase green)
        {
            Red = red;
            Green = green;
        }

        // Watch out for potential conflicts between setters
        // and ctor params. The easiest thing is to just make
        // setters private
        public IDatabase Green { get; private set; }
        public IDatabase Red { get; private set; }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-22 11:36:34

我在测试中使用的As<T>()扩展方法不是BCL的一部分,这就是您找不到它的原因。如果您正在使用Shouldly,您可以使用ShouldBeOfType<T>()来实现同样的效果,或者在进行比较之前将其转换为正常值。Each()扩展也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37963539

复制
相关文章

相似问题

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