如何使用Ninject处理带静态方法的类?
也就是说,在C#中,一个接口中不能有静态方法,而Ninject在使用接口的基础上工作?
我的用例是一个类,我希望它有一个静态方法来创建一个未填充的自身实例.
编辑1
只是在TopologyImp类中添加一个示例,在GetRootNodes()方法中,如何创建一些要返回的iNode类?我会用正常的代码练习构建这些或者我会以某种方式使用Ninject吗?但是,如果我使用容器创建那么我没有给IOC这个库知识呢?
public interface ITopology
{
List<INode> GetRootNodes();
}
public class TopologyImp : ITopology
{
public List<INode> GetRootNodes()
{
List<INode> result = new List<INode>();
// Need code here to create some instances, but how to without knowledge of the container?
// e.g. want to create a few INode instances and add them to the list and then return the list
}
}
public interface INode
{
// Parameters
long Id { get; set; }
string Name { …Run Code Online (Sandbox Code Playgroud) 查看为ASP.NET MVC2编写的http://lukesampson.com/post/471548689/entering-and-exiting-https-with-asp-net-mvc中的示例代码,我注意到他们可以检查自定义属性是否为通过访问filterContext.ActionDescriptor和filterContext.ActionDescriptor.ControllerDescriptor分别应用于当前操作或控制器:
public class ExitHttpsIfNotRequiredAttribute : FilterAttribute, IAuthorizationFilter {
public void OnAuthorization(AuthorizationContext filterContext) {
// snip
// abort if a [RequireHttps] attribute is applied to controller or action
if(filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Length > 0) return;
if(filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Length > 0) return;
// snip
}
}
Run Code Online (Sandbox Code Playgroud)
检查自定义属性的操作和控制器的ASP.NET MVC 1方法是什么?在ASP.NET MVC 1中filterContext.ActionDescriptor,我无法分辨.
我已经为我的一些对象添加了一个自定义属性,如下所示:
[JsonCustomRoot("status")]
public class StatusDTO
{
public int StatusId { get; set; }
public string Name { get; set; }
public DateTime Created { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
属性非常简单:
public class JsonCustomRoot :Attribute
{
public string rootName { get; set; }
public JsonCustomRoot(string rootName)
{
this.rootName = rootName;
}
}
Run Code Online (Sandbox Code Playgroud)
序列化对象实例时JSON.NET的默认输出是:
{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:如何使用自定义属性的值向JSON添加根节点,如下所示:
{status:{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}}
Run Code Online (Sandbox Code Playgroud)
我发现有几篇提到IContractResolver接口的文章,但我无法理解如何做到这一点.我的尝试包括这段未完成的代码:
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
var info = objectType.GetCustomAttributes()
.SingleOrDefault(t => (Type)t.TypeId==typeof(JsonCustomRoot));
if (info != null) …Run Code Online (Sandbox Code Playgroud) 我已经升级了[VS2008内置的[.vdproj MSI生成器项目] System.Configuration.Install.Installer,其中a ServiceProcessInstaller和a ServiceInstaller从Visual Studio 2005到2008.安装程序类没有任何自定义的后果(即,没有尝试启动或停止服务或注册儿童)
RemovePreviousVersions设置为true,我正在改变Version和ProductCode.这会在安装期间触发错误:
"错误1001:指定的服务已存在"
谷歌搜索产生的东西(但直到现在才开始): - 谷歌"指定的服务已经存在"
我迄今看到的最有用的是http://forums.msdn.microsoft.com/en-US/winformssetup/thread/b2d1bd22-8499-454e-9cec-1e42c03e2557 /
但是这并没有回答这个基本问题: -
鉴于用户可以选择:
a)安装位置相同
或b)安装位置不同
,最小的代码更改是否合理地确保旧服务被卸载并且新服务被安装?或者,对于将v1.0.1升级到具有相同名称的相同服务的v1.0.2的基本方案(即签名),是否需要进行其他代码更改以解决此问题
(如果在新安装程序中有一个重要的卸载步骤,那么强大的命名只会在新的安装程序中发挥作用.)
我在VS 2008中生成了一个新的安装程序,它的表现并不好.
目前,我的解决方法是停止更新Version并ProductCode强制用户在被告知已安装版本时手动卸载.
附录感谢divo的探测:虽然最简单的黑客攻击可能是"如果调用安装步骤及其升级,请首先调用卸载步骤",我想要一个正确的正式祝福答案!(例如,在升级过程中重命名服务时,简单的黑客如何应对?)
installer windows-installer windows-services uninstallation visual-studio-2008
在C#中,当我反映派生类型时,为什么我看不到基类的静态字段?
我都试过type.GetFields(BindingFlags.Static)和type.GetFields().
我有一个在Windows Server 2003上运行的CruiseControl .NET构建服务器,我正在尝试使用msbuild构建和发布我的ClickOnce应用程序.
除非我启用ClickOnce应用程序的引导程序,否则一切正常.发生这种情况时,我在DeploymentGenerateBootstrapper目标中收到以下错误:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (3939,9):
error MSB3147:
Could not find required file 'setup.bin' in 'E:\Projects\src\TestProject\Engine'.
Run Code Online (Sandbox Code Playgroud)
.NET Framework 3.5 SP1和4以及最新的Windows SDK都安装在服务器上,但C:\ Program Files\Microsoft SDKs\Windows\versionNo \中的引导程序文件夹不存在.我试着从我的工作站机器上复制文件而没有运气.
我不想在服务器上安装Visual Studio,只安装必要的SDK.
我也尝试从我的机器上复制bootsrapper文件夹
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper
Run Code Online (Sandbox Code Playgroud)
建立服务器,但没有运气.
有任何想法吗?
在.NET 4.0中使用msbuild,我可以使用"Package"目标构建Web项目,并且可以将包放在zip文件中.但是,当我查看那里的web.config时,它没有被转换,它有"$(ReplacableToken_Web_SiteConnection-Web.config Connection String_0)"
我可以运行"TransformWebConfig"目标,它将进行正确的转换,但只是在自己的孤岛中.
我还可以运行"Build"目标并传递"DeployOnBuild = True; DeployTarget = MSDeployPublish"属性,它将在我的服务器上部署包,并完成正确的web.config转换.
但是,如果我想手动将软件包部署到服务器,如何使用"TransformWebConfig"执行"Package",以便zip文件中包含最终的web.config?
我即将开始一个项目,其中使用的IoC是AutoFac - 在一家新公司.我之前没有DI/IoC的经验,想要加快速度,所以我看起来并不太愚蠢.这将是一个WPF应用程序(我再也不是太狡猾了,但那会好的)
我可以用什么好的资源来学习Autofac和IoC?我将在下周一的星期一开始我们的初始阶段:(本周末我已经把所有东西都拿走了!
我应该提一下,虽然IoC的想法很棒,但我不知道当我们在其他领域使用它时,我们如何随身携带"容器".我们是否创建了一个单例(那个接缝来表示不好)或者我们是否创建了一个带有GetService访问器的静态类?
编辑:我正在阅读关于Autofac的codeproject文章,并且想知道IoC正在尝试通过NInject教程解决什么,但没有什么可靠的.
这是一个好奇的问题,你们都知道:
使用Func而不是方法有什么危害/缺点吗?简单的例子:
private static Func<int, int, DBContext, List<T>> Foo =
(i1, i2, dbc) =>
(i1 != 0) ? dbc.Bar(i2) : new List<T> { /*some default values ...*/ };
Run Code Online (Sandbox Code Playgroud)
VS
private static List<T> Foo(int i1, int i2, DBContext dbc)
{
return i1 != 0 ? dbc.Bar(i2) : new List<T> { /*some default values ...*/ };
}
Run Code Online (Sandbox Code Playgroud) 例:
public class BusinessTransactionFactory<T> where T : IBusinessTransaction
{
readonly Func<Type, IBusinessTransaction> _createTransaction;
public BusinessTransactionFactory(Func<Type, IBusinessTransaction> createTransaction)
{
_createTransaction = createTransaction;
}
public T Create()
{
return (T)_createTransaction(typeof(T));
}
}
Run Code Online (Sandbox Code Playgroud)
使用相同的容器设置代码:
public class DependencyRegistration : Registry
{
public DependencyRegistration()
{
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.WithDefaultConventions();
x.AddAllTypesOf(typeof(Repository<>));
x.ConnectImplementationsToTypesClosing(typeof(IRepository<>));
});
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.AddAllTypesOf<IBusinessTransaction>();
For(typeof(BusinessTransactionFactory<>)).Use(typeof(BusinessTransactionFactory<>));
For<Func<Type, IBusinessTransaction>>().Use(type => (IBusinessTransaction)ObjectFactory.GetInstance(type));
});
For<ObjectContext>().Use(() => new ManagementEntities());
}
}
Run Code Online (Sandbox Code Playgroud)
你怎么看?