问题是关于受孕。
我有这样简单的课程:
public class Data
{
string Server = "";
public Data(string Server)
{
this.Server = Server;
}
public class Items
{
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public Item Get(int Id)
{
var result = new Item();
// here im am using sql connection to set result, but i need Server value in connnection string
return result;
}
}
}
这可能没有意义,但我解释了我想要实现的目标 现在我可以像这样制作实例:
var data = new Data("0.0.0.0");
var item = new Data.Items().Get(3);
但物体没有任何联系 我想以这种方式获取/设置数据:
var item = new Data("0.0.0.0").Items().Get(3);
或者像这样:
var data = new Data("0.0.0.0");
var item1 = data.Items().Get(3);
var item2 = data.Items().Save(3);
var item3 = data.OtherItems().Get(3);
简而言之,我想启动主类并传递在子类中执行方法所需的参数。如果不从父类调用子类中的方法,则不应该使用子类中的方法
有可能吗?
目标是在不使用静态prop的情况下确定数据来自哪个数据库实例。然后调用单个方法而不必传递SQL实例的名称。
编辑以获得更深入的解释:
现在我可以像这样在主类中编写所有方法。
public class Data
{
string Server = "";
public Data(string Server)
{
this.Server = Server;
}
public List<Item> Items_List() { return new List<Item>(); }
public Item Items_Get(Int32 id) { return new Item(); }
public void Items_Save(Item item) { }
public List<Firm> Firms_List() { return new List<Firm>(); }
public Firm Firms_Get(Int32 id) { return new Firm(); }
public void Firms_Save(Firm item) { }
public List<Location> Location_List() { return new List<Location>(); }
public Location Location_Get(Int32 id) { return new Location(); }
public void Location_Save(Location item) { }
}
然后我这样打电话:
var firms = data.Firms_List();
var firm = data.Firms_Get(firms[0].Id);
firm.Name = "New name";
data.Firms_Save(firm);
我想将“_”更改为“。”在方法名称中,以获得更好的可见性和类型分组,如下所示:
var firms = data.Firms.List();
var firm = data.Firms.Get(firms[0].Id);
firm.Name = "New name";
data.Firms.Save(firm);
这可能吗?
也许有一种方法可以对上述方法进行分组?
或者也许想法是错误的。
答案 0 :(得分:1)
您的Data
对象可以保存服务器(以及其他相关信息,如凭据),但每种类型的成员对象必须具有对Data
对象的引用才能访问正确的实例数据:
public class Data {
string server;
public Data(string Server) {
server = Server;
items = new DataBase<Item>(this);
firms = new DataBase<Firm>(this);
locations = new DataBase<Location>(this);
otherItems = new OtherItem(this);
}
public class DataBase<T> where T : new() {
Data data;
public DataBase(Data myData) {
data = myData;
}
public virtual List<T> List() => new List<T>();
public virtual T Get(Int32 id) => new T();
public virtual void Save(T item) {
var s = data.server;
}
}
public class OtherItem : DataBase<Item> {
public OtherItem(Data myData) : base(myData) {
}
public override List<Item> List() {
return new List<Item>();
}
public override Item Get(int id) {
return new Item();
}
public override void Save(Item item) {
base.Save(item);
}
}
DataBase<Item> items;
DataBase<Firm> firms;
DataBase<Location> locations;
OtherItem otherItems;
public DataBase<Item> Items() => items;
public DataBase<Firm> Firms() => firms;
public DataBase<Location> Locations() => locations;
public OtherItem OtherItems() => otherItems;
}
现在你可以这样做:
var data = new Data("0.0.0.0");
var item1 = data.Items().Get(3);
data.Items().Save(item1);
var item3 = data.OtherItems().Get(3);
我不打算使用方法Items()
而只是直接使用Item
属性。
我不知道如何阻止某人存储子引用并使用它,但是:
var dataItems = data.Items();
var item4 = dataItems.Get(4);
答案 1 :(得分:0)
看起来你需要一种作用于项目表的存储库类。
public class Items
{
private Server { get; }
public Items(string server) => Server = server;
public Item Get(int id)
{
var item = new Item();
//use Server inside the connectionString
return item;
}
public void Save(Item item)
{
//use server inside the connectionstring to save the given item
}
}
答案 2 :(得分:0)
非常奇怪的设计。我认为你只需要Item类......并且在该类中是通过f.e访问sql数据库。之前已打开的连接字符串或全局连接。连接字符串可以存储在web.config或app.config中,并在应用程序的任何位置使用。
<强>更新强>
下面适合你吗? ...我在Windows窗体应用程序中尝试过,此语句在那里工作:
Item myItem = new Data("0.0.0").Item_Get (1);
班级:
public class Data {
string Server = "";
public Data(string Server) {
this.Server = Server;
}
public Item Item_Get(int Id) {
var result = new Item();
// here im am using sql connection to set result, but i need Server value in connnection string
return result;
}
}
public class Item {
public int Id { get; set; }
public string Name { get; set; }
}
答案 3 :(得分:-1)
我不确定我理解这个设计的目的是什么,但无论如何,你可以想到一些语法上正确的方法来实现它。
首先,你可以将方法抽象化。在这种情况下,只能执行派生类的实现。如果此方法受到保护,则只有父类可以调用它。
另一方面,尽管您的解释是您不希望“传递SQL实例的名称”,但我的印象是对象状态正是出于此目的 - 区分具有不同历史的对象,因此,使他们的行为不同。
我不知道这是否满足您的期望,但又一次 - 我非常关注您提出的设计背后的动机。
答案 4 :(得分:-1)