【发布时间】:2014-05-21 13:44:10
【问题描述】:
可以让它在 C# 中工作:
- 创建名为 UnityCSharp 的 C# 控制台应用程序
- 添加 Unity NuGet
- 参考 System.Configuration
- 如下添加App.config和C#代码,就可以了
C# 的 App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="myAlias" type="UnityCSharp.ILogger, UnityCSharp" />
<container>
<register type="myAlias" mapTo="UnityCSharp.Logger, UnityCSharp" />
<register type="myAlias" mapTo="UnityCSharp.SpecialLogger, UnityCSharp" name="special" />
</container>
</unity>
</configuration>
C#:
using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
namespace UnityCSharp
{
public interface ILogger { string SayHello(); }
public class Logger : ILogger { public string SayHello() { return "hello"; } }
public class SpecialLogger : ILogger { public string SayHello() { return "special hello"; } }
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer().LoadConfiguration();
Console.WriteLine(container.Resolve<ILogger>().SayHello()); // --> "hello"
Console.WriteLine(container.Resolve<ILogger>("special").SayHello()); // --> "special hello"
Console.ReadLine();
}
}
}
但不能在 F# 中重复(同样是控制台应用,名为 UnityFSharp,相同的 NuGet 和 System.Configuration 引用)。
F# 的 App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="myAlias" type="UnityFSharp.ILogger, UnityFSharp" />
<container>
<register type="myAlias" mapTo="UnityFSharp.Logger, UnityFSharp" />
<register type="myAlias" mapTo="UnityFSharp.SpecialLogger, UnityFSharp" name="special" />
</container>
</unity>
</configuration>
F#:
open System;
open Microsoft.Practices.Unity
open Microsoft.Practices.Unity.Configuration
type ILogger = abstract SayHello : unit -> string
type Logger() = interface ILogger with member x.SayHello () = "hello"
type SpecialLogger() = interface ILogger with member x.SayHello () = "special hello"
[<EntryPoint>]
let main argv =
let container = (new UnityContainer()).LoadConfiguration() // CRASHES HERE
Console.WriteLine (container.Resolve<ILogger>().SayHello()) // --> "hello"
Console.WriteLine (container.Resolve<ILogger>("special").SayHello()) // --> "special hello"
Console.ReadLine() |> ignore
0
会失败:
无法解析类型名称或别名 myAlias。请检查 您的配置文件并验证此类型名称。
我了解 F# 中的命名方式不同(http://ilspy.net/ 截图如下)。 但是我究竟怎样才能让它工作呢? 我尝试过各种 F# 模块、命名空间和 App.config 版本。 只有一个工作示例会有所帮助! (我可以重组我的 F#)
【问题讨论】:
标签: dependency-injection f# unity-container design-time